home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 14 / CU Amiga Magazine's Super CD-ROM 14 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-09].iso / CUCD / Graphics / WildFire / WildFireNoFPU / Bonus / PSMP / src / psmp_1.00.s
Encoding:
Text File  |  1997-01-21  |  47.0 KB  |  2,419 lines

  1. ;
  2. ; "PSMP"  Play Sample
  3. ; -------------------
  4. ; by Smack/Infect
  5. ;
  6. ;
  7. ; REQUIRES: OS V37+
  8. ;
  9. ;
  10. ; V0.1 (Wednesday 17-Jul-96)
  11. ;   -first version
  12. ;       play uncompressed IFF-8SVX on all 4 channels
  13. ;       audio.device for allocating channels
  14. ;       hardware hits: level 4 irq, filter, audio
  15. ;
  16. ; V0.2 (Tue 01-Oct-96)
  17. ;   -support compressed samples (1=Fibonacci Delta, 2=Exponential Delta)
  18. ;   -"PLAYBACKRATE" option
  19. ;   -exec interrupt handler (INTB_AUD0)
  20. ;
  21. ; V0.3 (Sat 05-Oct-96)
  22. ;   -support XPK compressed samples (using XpkOpen(), XpkRead() etc.)
  23. ;   -runtime controls:
  24. ;     CTRL-F = toggle filter
  25. ;     CTRL-E = repeat mode off
  26. ;     CTRL-D = repeat mode on
  27. ;     CTRL-C = exit immediately
  28. ;
  29. ; V0.4 (Thu 10-Oct-96)
  30. ;   -replaced 68020+ instructions (MUL/DIV) by utility.library calls
  31. ;
  32. ; V0.5 (Fri 25-Oct-96)
  33. ;   -support stereo samples
  34. ;   -better handling of "loading not ready in time"-situations
  35. ;    (now there is a silent gap instead of playing "trash")
  36. ;   -major internal cleanups
  37. ;
  38. ; V0.6 (Wed 06-Nov-96)
  39. ;   -added Workbench startup
  40. ;   -fixed Signal()/Wait() calls (use signalmask instead of signalnumber!)
  41. ;   -fixed handling of odd chunksizes
  42. ;
  43. ; V0.7 (Sat 16-Nov-96)
  44. ;   -added "SMALLWINDOW" and "LOADALL" options/tooltypes
  45. ;
  46. ; V0.8 (Sat 07-Dec-96)
  47. ;   -fixed argument parsing
  48. ;   -added progressbar
  49. ;   -removed "SMALLWINDOW" (by default output to shell and progressbar)
  50. ;   -added options "NOPROGRESS", "NOINFO", "PUBSCREEN"
  51. ;
  52. ; V0.9 (Tue 14-Jan-97)
  53. ;   -errors (open file, 8SVX format check) now cause reqtools-filerequester
  54. ;   -changed look of progress window slightly
  55. ;
  56. ; V1.00 (Tue 21-Jan-97)
  57. ;   -"locked" progress window doesn't hold loader anymore
  58. ;   -added gadgets for REPEAT, INFO and FILTER to the progress window
  59.  
  60.  
  61.  
  62. buffersize=32*1024    ;must be below 64K
  63.     incdir    includes:
  64.     include    libraries/xpk.i
  65.     include    os_macros.is
  66.     include    hardware-registers.is
  67.     include    dos/dos.i
  68.     include    dos/dosextens.i
  69.  
  70.  
  71.     STRUCTURE myFH,0
  72.     ULONG    mfh_fh        ;(must be the first item!!)
  73.     UWORD    mfh_is_xpk    ;if non-zero then XPK
  74.     ULONG    mfh_filepos    ;XPK only - position in file
  75.     APTR    mfh_xbuff    ;XPK only - address of decrunch buffer
  76.     ULONG    mfh_xbuffsize    ;XPK only - size of decrunch buffer (=XPK chunksize)
  77.     APTR    mfh_buffpos    ;XPK only - current position in decrunch buffer
  78.     ULONG    mfh_buffcontent    ;XPK only - current content of decrunch buffer
  79.     APTR    mfh_filename    ;(must be the last item!!)
  80.     LABEL    mfh_SIZEOF
  81.  
  82.     section    aaaa,code
  83. first_
  84.     basereg    first_,a4
  85.     lea    (first_,pc),a4
  86. ;--------------------------------------
  87. ; open libs
  88.     move.l    (4.w),a6
  89.     move.l    (378,a6),a0    ;LibList
  90.     lea    (dosnam,pc),a1
  91.     CALL    FindName        ;DOS
  92.     move.l    d0,(dosbase,a4)
  93.     move.l    (378,a6),a0    ;LibList
  94.     lea    (gfxnam,pc),a1
  95.     CALL    FindName        ;GFX
  96.     move.l    d0,(gfxbase,a4)
  97.     move.l    (378,a6),a0    ;LibList
  98.     lea    (intuinam,pc),a1
  99.     CALL    FindName        ;INTUITION
  100.     move.l    d0,(intuitionbase,a4)
  101.     lea    (utilnam,pc),a1
  102.     moveq    #37,d0
  103.     CALL    OpenLibrary        ;UTILITY
  104.     move.l    d0,(utilitybase,a4)
  105.     beq.w    err_ende
  106.     lea    (iconnam,pc),a1
  107.     moveq    #37,d0
  108.     CALL    OpenLibrary        ;ICON
  109.     move.l    d0,(iconbase,a4)
  110.     beq.w    err_ende
  111.     lea    (gtnam,pc),a1
  112.     moveq    #37,d0
  113.     CALL    OpenLibrary        ;GADTOOLS
  114.     move.l    d0,(gadtoolsbase,a4)
  115.     beq.w    err_ende
  116.  
  117.  
  118. ;--------------------------------------
  119. ; handle arguments
  120.     sub.l    a1,a1
  121.     CALL    FindTask
  122.     move.l    d0,a5
  123.     tst.l    (172,a5)    ;pr_CLI
  124.     bne.b    .from_cli
  125.     lea    (92,a5),a0    ;pr_MsgPort
  126.     CALL    WaitPort
  127.     lea    (92,a5),a0    ;pr_MsgPort
  128.     CALL    GetMsg            ;workbench msg
  129.     move.l    d0,(wbmsg,a4)
  130.     bra.b    .not_cli
  131. .from_cli
  132.     lea    (template,pc),a0
  133.     move.l    a0,d1
  134.     lea    (filenamept,pc),a0
  135.     move.l    a0,d2
  136.     moveq    #0,d3
  137.     CALLDOS    ReadArgs        ;read command line args
  138.     move.l    d0,(rdargs,a4)
  139.     bne.b    .args_ok
  140.     lea    (args_start,pc),a0
  141.     lea    (args_end,pc),a1
  142. .argclr    clr.l    (a0)+
  143.     cmp.l    a0,a1
  144.     bne.b    .argclr
  145. .args_ok
  146. .not_cli
  147.  
  148.     move.l    (wbmsg,pc),d0
  149.     beq.w    .not_wb
  150.     move.l    d0,a5            ;a5=wbmsg
  151.     move.l    (36,a5),a3    ;sm_ArgList
  152.     move.l    (a3),d1        ;wa_Lock
  153.     CALLDOS    CurrentDir
  154.     move.l    d0,(oldcurrdir,a4)
  155.     move.l    (4,a3),a0    ;wa_Name
  156.     CALLICON GetDiskObject        ;read program's icon
  157.     move.l    d0,d7
  158.     beq.b    .no_icon1
  159.     bsr.b    .read_tooltypes
  160.     move.l    d7,a0
  161.     CALL    FreeDiskObject
  162. .no_icon1
  163.     move.l    (28,a5),d0    ;sm_NumArgs
  164.     subq.l    #1,d0
  165.     beq.b    .no_icon2
  166.     move.l    (36,a5),a3    ;sm_ArgList
  167.     move.l    (8,a3),d1    ;wa_sizeof+wa_Lock
  168.     CALLDOS    CurrentDir
  169.     move.l    (12,a3),a1    ;wa_sizeof+wa_Name
  170.     move.l    a1,a0
  171.     move.l    (filenamebuffpt,pc),a2
  172.     move.l    a2,(filenamept,a4)
  173. .cloo    move.b    (a1)+,(a2)+
  174.     bne.b    .cloo
  175.     CALLICON GetDiskObject        ;read sample's icon
  176.     move.l    d0,d7
  177.     beq.b    .no_icon2
  178.     bsr.b    .read_tooltypes
  179.     move.l    d7,a0
  180.     CALL    FreeDiskObject
  181. .no_icon2
  182.     bra.w    .not_wb
  183. .read_tooltypes
  184.     move.l    d7,a0
  185.     move.l    ($36,a0),a3    ;a3=do_ToolTypes
  186.     move.l    a3,a0        ;PLAYBACKRATE
  187.     lea    (tt_rate,pc),a1
  188.     CALL    FindToolType
  189.     move.l    d0,d1
  190.     lea    (rate_arg,pc),a0
  191.     move.l    a0,d2
  192.     move.l    a0,(playbackrate,a4)
  193.     CALLDOS    StrToLong
  194.     move.l    a3,a0        ;FILTER
  195.     lea    (tt_filter,pc),a1
  196.     CALLICON FindToolType
  197.     move.l    d0,(filter,a4)
  198.     move.l    a3,a0        ;REPEAT
  199.     lea    (tt_repeat,pc),a1
  200.     CALL    FindToolType
  201.     move.l    d0,(repeat,a4)
  202.     move.l    a3,a0        ;INFO
  203.     lea    (tt_info,pc),a1
  204.     CALL    FindToolType
  205.     move.l    d0,(info,a4)
  206.     move.l    a3,a0        ;LOADALL
  207.     lea    (tt_loadall,pc),a1
  208.     CALL    FindToolType
  209.     move.l    d0,(loadall,a4)
  210.     move.l    a3,a0        ;NOPROGRESS
  211.     lea    (tt_noprogress,pc),a1
  212.     CALL    FindToolType
  213.     move.l    d0,(noprogress,a4)
  214.     move.l    a3,a0        ;NOINFO
  215.     lea    (tt_noinfo,pc),a1
  216.     CALL    FindToolType
  217.     move.l    d0,(noinfo,a4)
  218.     move.l    a3,a0        ;PUBSCREEN
  219.     lea    (tt_pubscreen,pc),a1
  220.     CALL    FindToolType
  221.     tst.l    d0
  222.     beq.b    .nops
  223.     move.l    d0,a0
  224.     lea    (psnam),a1
  225.     move.l    a1,(pubscrnam,a4)
  226. .pscopy    move.b    (a0)+,(a1)+
  227.     bne.b    .pscopy
  228. .nops    rts
  229. .not_wb
  230.  
  231.     move.l    (noinfo,pc),d0
  232.     bne.b    .noinfo
  233.     CALLDOS    Output
  234.     move.l    d0,(output,a4)        ;output
  235.     bne.b    .output_ok
  236.     lea    (connam,pc),a0
  237.     move.l    a0,d1
  238.     move.l    #MODE_OLDFILE,d2
  239.     CALL    Open            ;open own window
  240.     move.l    d0,(output,a4)
  241.     move.l    d0,(conwindow,a4)
  242. .output_ok
  243.     move.l    (output,pc),d1
  244.     lea    (maintxt,pc),a0
  245.     move.l    a0,d2
  246.     CALLDOS    FPutS            ;print title string
  247.     tst.l    (wbmsg,a4)
  248.     bne.b    .info
  249.     tst.l    (rdargs,a4)
  250.     bne.b    .info
  251.     move.l    (output,pc),d1
  252.     lea    (argwarntxt,pc),a0
  253.     move.l    a0,d2
  254.     CALL    FPutS
  255.     bra.b    .info
  256. .noinfo
  257.     clr.l    (info,a4)
  258. .info
  259.     move.l    (playbackrate,pc),d0
  260.     beq.b    .norate_arg
  261.     move.l    d0,a0
  262.     move.l    (a0),d0
  263.     ble.b    .norate_arg
  264.     move.l    d0,(rate_arg,a4)
  265. .norate_arg
  266.  
  267.     tst.l    (filenamept,a4)
  268.     bne.w    skipfilerequester
  269. dofilerequester
  270.     moveq    #38,d0
  271.     lea    (rtnam,pc),a1
  272.     CALLEXEC OpenLibrary        ;V38 reqtools.library
  273.     tst.l    d0
  274.     beq.w    ende
  275.     move.l    d0,a6
  276.     moveq    #0,d0        ;RT_FILEREQ
  277.     sub.l    a0,a0
  278.     CALL    rtAllocRequestA
  279.     tst.l    d0
  280.     beq.w    err_ende
  281.     move.l    d0,a5
  282.     lea    (filereqtags,pc),a0
  283.     move.l    a5,a1
  284.     move.l    (lbuffpt,pc),a2
  285.     lea    (filereqtitle,pc),a3
  286.     CALL    rtFileRequestA
  287.     move.l    (16,a5),a0    ;filereq->dir
  288.     move.l    (filenamebuffpt,pc),a1
  289.     clr.l    (a1)
  290. .dircop    move.b    (a0)+,(a1)+
  291.     bne.b    .dircop
  292.     move.l    a6,d7
  293.     move.l    (filenamebuffpt,pc),d1
  294.     move.l    (lbuffpt,pc),d2
  295.     move.l    #1024,d3
  296.     CALLDOS    AddPart
  297.     move.l    d7,a6
  298.     move.l    (filenamebuffpt,pc),(filenamept,a4)
  299.     move.l    a5,a1
  300.     CALL    rtFreeRequest
  301.     move.l    a6,a1
  302.     CALLEXEC CloseLibrary
  303.     move.l    (filenamebuffpt,pc),a0
  304.     tst.l    (a0)
  305.     beq.w    ende            ;cancelled or empty string
  306. skipfilerequester
  307.  
  308. ;--------------------------------------
  309. ; init file
  310.     move.l    (dosbase,pc),a6
  311.     move.l    #"FORM",d6        ;!!!!!
  312.     move.l    #"8SVX",d7        ;!!!!!
  313.  
  314.     move.l    (loadall,pc),d0
  315.     beq.w    .notloadall
  316.  
  317.     ;----LOADALL
  318.     move.l    (filenamept,pc),d1
  319.     move.l    #MODE_OLDFILE,d2
  320.     CALL    Open
  321.     move.l    d0,d5
  322.     beq.w    dofilerequester
  323.     move.l    d5,d1
  324.     move.l    (buff1pt,pc),d2
  325.     move.l    d2,a5
  326.     moveq    #32,d3
  327.     CALL    Read
  328.     move.l    d0,d4        ;read error
  329.     move.l    d5,d1
  330.     move.l    (buff2pt,pc),d2
  331.     CALL    ExamineFH
  332.     move.l    d5,d1
  333.     move.l    d0,d5        ;examine error
  334.     CALL    Close
  335.     tst.l    d4
  336.     bmi.w    ifferr        ;ENDSTREAMCH
  337.     tst.l    d5
  338.     beq.w    ifferr        ;DOSFALSE
  339.  
  340.     move.l    (buff1pt,pc),a0
  341.     cmp.l    #"XPKF",(a0)
  342.     bne.b    .notxpk
  343.     add    #16,a0
  344. .notxpk    cmp.l    (a0),d6
  345.     bne.w    ifferr
  346.     cmp.l    (8,a0),d7    ;FORM 8SVX ?
  347.     bne.w    ifferr
  348.  
  349.     move.l    (buff2pt,pc),a0
  350.     move.l    (108+16,a0),d5    ;fib.Size
  351.     ble.w    ifferr
  352.     move.l    d5,d0
  353.     moveq    #0,d1
  354.     CALLEXEC AllocVec
  355.     move.l    d0,(loadallvec,a4)
  356.     bne.b    .memok
  357.     clr.l    (loadall,a4)
  358.     bra.b    .notloadall
  359.  
  360. .memok    move.l    (filenamept,pc),d1
  361.     move.l    #MODE_OLDFILE,d2
  362.     CALLDOS    Open
  363.     move.l    d0,d4
  364.     beq.w    err_ende
  365.     move.l    d0,d1
  366.     move.l    (loadallvec,pc),d2
  367.     move.l    d5,d3
  368.     CALL    Read
  369.     move.l    d4,d1
  370.     move.l    d0,d4        ;read error
  371.     CALL    Close
  372.     cmp.l    d4,d5
  373.     bne.w    readerr
  374.     move.l    #XPK_InBuf,(xpkopentags,a4)
  375.     move.l    (loadallvec,pc),(xpkopentags+4,a4)
  376.     move.l    #XPK_InLen,(xot_inlen,a4)
  377.     move.l    d5,(xot_inlen+4,a4)
  378. .notloadall
  379.  
  380.     ;----not LOADALL
  381. xopen_again
  382.     lea    (smpfh1,pc),a0
  383.     move.l    (filenamept,pc),(mfh_filename,a0)
  384.     bsr.w    _XOpen
  385.     tst.l    d0
  386.     beq.b    openok
  387. handle_xopen_error
  388.     addq.l    #1,d0
  389.     bne.b    not___1
  390.     bra.w    dofilerequester
  391.  
  392. putstr    move.l    a0,d2
  393.     move.l    (output,pc),d1
  394.     CALLDOS    FPutS
  395.     bra.w    err_ende
  396.  
  397. not___1
  398.     addq.l    #1,d0
  399.     bne.b    not___2
  400.     lea    (xpknam,pc),a1        ;-2
  401.     moveq    #2,d0
  402.     CALLEXEC OpenLibrary
  403.     move.l    d0,(xpkbase,a4)
  404.     bne.b    xopen_again
  405.     lea    (xpkliberrtxt,pc),a0
  406.     bra.b    putstr
  407. not___2
  408.     addq.l    #1,d0
  409.     bne.b    not___3
  410. xpkerr    lea    (xpkerrtxt,pc),a0    ;-3,  global "print xpk error"
  411.     move.l    a0,d2
  412.     lea    (xpkerrtxtargs,pc),a0
  413.     move.l    a0,d3
  414.     move.l    (output,pc),d1
  415.     CALLDOS    VFPrintf
  416.     bra.w    err_ende
  417. not___3
  418.     addq.l    #1,d0
  419.     bne.w    err_ende
  420. memerr    lea    (memerrtxt,pc),a0    ;-4,  global "print mem error"
  421.     bra.b    putstr
  422. openok
  423.     ;---check IFF-8SVX
  424.     lea    (smpfh1,pc),a0
  425.     move.l    (buff1pt,pc),d2
  426.     moveq    #12,d3
  427.     bsr.w    _XRead
  428.     cmp.l    d0,d3
  429.     bne.b    ifferr
  430.     move.l    (buff1pt,pc),a0
  431.     cmp.l    (a0),d6            ;!!!!!
  432.     bne.b    ifferr
  433.     cmp.l    (8,a0),d7        ;!!!!!
  434.     beq.b    form_ok
  435. ifferr    bra.w    dofilerequester
  436. form_ok
  437.     ;---read VHDR, CHAN, move to beginning of BODY
  438. chunkloop
  439.     lea    (smpfh1,pc),a0
  440.     move.l    (buff1pt,pc),d2
  441.     moveq    #8,d3
  442.     bsr.w    _XRead
  443.     cmp.l    d0,d3
  444.     bne.b    ifferr
  445.     move.l    (buff1pt,pc),a0
  446.  
  447.     cmp.l    #"VHDR",(a0)        ;---VHDR
  448.     bne.b    .not_vhdr
  449.     move.l    a0,d2
  450.     move.l    (4,a0),d3
  451.     lea    (smpfh1,pc),a0
  452.     bsr.w    _XRead            ;len should be 20
  453.     cmp.l    d0,d3
  454.     bne.b    ifferr
  455.     move.l    (buff1pt,pc),a0
  456.     move    (12,a0),(rate+2,a4)        ;vh_SamplesPerSec
  457.     move.b    (15,a0),(compression+1,a4)    ;vh_Compression
  458.     bra.b    chunkloop
  459. .not_vhdr
  460.     cmp.l    #"CHAN",(a0)        ;---CHAN
  461.     bne.b    .not_chan
  462.     move.l    a0,d2
  463.     move.l    (4,a0),d3
  464.     lea    (smpfh1,pc),a0
  465.     bsr.w    _XRead            ;len should be 4
  466.     cmp.l    d0,d3
  467.     bne.b    ifferr
  468.     move.l    (buff1pt,pc),a0
  469.     cmp.l    #6,(a0)
  470.     bne.b    .not_st
  471.     st    (is_stereo,a4)
  472. .not_st    bra.b    chunkloop
  473. .not_chan
  474.     cmp.l    #"BODY",(a0)        ;---BODY
  475.     beq.b    .is_body
  476.  
  477.     move.l    (4,a0),d2        ;---skip other chunks
  478.     addq.l    #1,d2
  479.     lsr.l    #1,d2
  480.     add.l    d2,d2            ;round up to even length!!
  481.     moveq    #OFFSET_CURRENT,d3
  482.     lea    (smpfh1,pc),a0
  483.     bsr.w    _XSeek
  484.     bra.w    chunkloop
  485.  
  486. .is_body
  487.     move.l    (4,a0),d0
  488.     move.l    d0,(bodyend,a4)
  489.     move.l    d0,(bodylen,a4)
  490.     lea    (smpfh1,pc),a0
  491.     moveq    #0,d2
  492.     moveq    #OFFSET_CURRENT,d3
  493.     bsr.w    _XSeek
  494.     move.l    d0,(bodystart,a4)
  495.     move.l    d0,(currpos,a4)
  496.     add.l    d0,(bodyend,a4)
  497.  
  498.     move.l    (output,pc),d1
  499.     lea    (filetxt,pc),a0
  500.     move.l    a0,d2
  501.     lea    (filenamept,pc),a0
  502.     move.l    a0,d3
  503.     CALLDOS    VFPrintf
  504.  
  505. ;--------------------------------------
  506. ; calc some things and print info text
  507.     tst.l    (rate_arg,a4)    ;option PLAYBACKRATE?
  508.     bne.b    .pbrate_arg
  509.     move.l    (rate,pc),(rate_arg,a4)
  510. .pbrate_arg
  511.     move.l    (4.w),a1
  512.     move.l    (568,a1),d7    ;ex_EClockFrequency
  513.     move.l    d7,d0
  514.     lsl.l    #2,d7
  515.     add.l    d0,d7        ;ex_EClockFrequency*5
  516.     move.l    (rate_arg,pc),d6
  517.     move.l    d7,d0
  518.     move.l    d6,d1
  519.     CALLUTIL UDivMod32
  520.     lsr.l    #1,d6
  521.     cmp.l    d6,d1        ;remainder
  522.     ble.b    .no_r_u
  523.     addq    #1,d0        ;round result up
  524. .no_r_u    move    d0,(rate_amiga,a4)
  525.     move.l    d0,d1
  526.     move.l    d7,d0
  527.     CALL    UDivMod32
  528.     move.l    d0,(rate_play,a4)
  529.  
  530.     move.l    (bodylen,pc),d0
  531.     tst    (compression,a4)
  532.     beq.b    .nocomp
  533.     add.l    d0,d0
  534. .nocomp    tst    (is_stereo,a4)
  535.     beq.b    .noster
  536.     lsr.l    #1,d0
  537. .noster    move.l    d0,(bytestoplay,a4)
  538.     move.l    (rate_play,pc),d7
  539.     move.l    d7,d1
  540.     CALL    UDivMod32
  541.     divu    #60,d0
  542.     move    d0,(minutes,a4)
  543.     swap    d0
  544.     move    d0,(seconds,a4)
  545.     move.l    #1000,d0
  546.     CALL    UMult32
  547.     move.l    d7,d1
  548.     CALL    UDivMod32
  549.     move    d0,(millisec,a4)
  550.  
  551.     lea    (comp0txt,pc),a0    ;none
  552.     move    (compression,pc),d0
  553.     beq.b    .cstr
  554.     lea    (comp1txt,pc),a0    ;Fibonacci Delta
  555.     subq    #1,d0
  556.     beq.b    .cstr
  557.     lea    (comp2txt,pc),a0    ;Exponential Delta
  558.     subq    #1,d0
  559.     beq.b    .cstr
  560.     lea    (comperrtxt,pc),a0    ;unknown compression
  561.     bra.w    putstr
  562. .cstr    move.l    a0,(compstr,a4)
  563.  
  564.     lea    (monotxt,pc),a0
  565.     tst    (is_stereo,a4)
  566.     beq.b    .ststr
  567.     lea    (stereotxt,pc),a0
  568. .ststr    move.l    a0,(stereostr,a4)
  569.  
  570.     move.l    (bodylen,pc),d0
  571.     moveq    #10,d1
  572.     lsr.l    d1,d0
  573.     move.l    d0,(bodylenKB,a4)
  574.  
  575.     tst    (smpfh1+mfh_is_xpk,a4)
  576.     beq.b    .not_xpk
  577.     move.l    (smpfh1+mfh_fh,pc),a0
  578.     move.l    (xf_Packer,a0),(packername,a4)
  579.     move.l    (xf_Ratio,a0),(packerratio,a4)
  580.     move.l    (xf_NLen,a0),d0
  581.     moveq    #10,d1
  582.     lsr.l    d1,d0
  583.     move.l    d0,(packerchszKB,a4)
  584.     lea    (xpktxt,pc),a0
  585.     move.l    a0,d2
  586.     lea    (xpktxt_args,pc),a0
  587.     move.l    a0,d3
  588.     move.l    (output,pc),d1
  589.     CALLDOS    VFPrintf
  590. .not_xpk
  591.     lea    (infotxt,pc),a0
  592.     move.l    a0,d2
  593.     lea    (infotxt_args,pc),a0
  594.     move.l    a0,d3
  595.     move.l    (output,pc),d1
  596.     CALLDOS    VFPrintf
  597.  
  598.  
  599.     tst.l    (info,a4)
  600.     bne.w    ende
  601.  
  602. ;--------------------------------------
  603. ; setup audio
  604.     CALLEXEC CreateMsgPort
  605.     move.l    d0,(msgport,a4)
  606.     beq.b    .audioerr
  607.  
  608.     move.l    d0,a0        ;msg port
  609.     moveq    #62,d0        ;ioa_sizeof
  610.     CALL    CreateIORequest
  611.     move.l    d0,(ioreq,a4)
  612.     beq.b    .audioerr
  613.  
  614.     move.l    d0,a1
  615.     move.b    #127,(9,a1)    ;channel pri
  616.     lea    (channelmap,pc),a0
  617.     move.l    a0,(34,a1)    ;ioa_data
  618.     moveq    #2,d0
  619.     move.l    d0,(38,a1)    ;ioa_length
  620.     lea    (audionam,pc),a0
  621.     moveq    #0,d0        ;unit
  622.     moveq    #0,d1        ;flags
  623.     CALL    OpenDevice
  624.     tst.l    d0
  625.     bne.b    .audioerr
  626.     st    (audioopen,a4)
  627.     bra.b    .audiook
  628. .audioerr
  629.     lea    (audioerrtxt,pc),a0
  630.     bra.w    putstr
  631. .audiook
  632. qqq1
  633.  
  634. ;--------------------------------------
  635. ; fill buffer the first time
  636.     move.l    (bodyend,pc),d0
  637.     sub.l    (bodystart,pc),d0
  638.     move.l    #buffersize*2,d3
  639.     move    (compression,pc),d7
  640.     beq.b    .nocom1
  641.     lsr.l    #1,d3        ;half loading size
  642. .nocom1
  643.     tst    (is_stereo,a4)
  644.     beq.b    .noster
  645.     lsr.l    #1,d0
  646. .noster
  647.     cmp.l    d3,d0
  648.     bge.b    .large
  649.  
  650.     st    (playmode,a4)        ;small
  651.     move.l    d0,d3
  652.     tst    d7
  653.     beq.b    .nocom2
  654.     add.l    d0,d0        ;double playing size
  655. .nocom2    move.l    d0,(buff1size,a4)
  656.     move.l    d0,(buff2size,a4)
  657.     move.l    (buff1pt,pc),(buff2pt,a4)
  658.     bra.b    .readit
  659. .large    lsr.l    #1,d3            ;large
  660. .readit
  661.     lea    (smpfh1,pc),a0
  662.     move.l    (buff1pt,pc),d2
  663.     tst    d7
  664.     beq.b    .nocom3
  665.     move.l    (lbuffpt,pc),d2
  666. .nocom3    bsr.w    _XRead
  667.     cmp.l    d0,d3
  668.     bne.b    readerr
  669.     add.l    d0,(currpos,a4)
  670.     bra.b    qqq2
  671. readerr
  672.     tst.l    (xpk_error,a4)
  673.     bne.w    xpkerr
  674.     lea    (readerrtxt,pc),a0
  675.     bra.w    putstr
  676. qqq2
  677.     move    d7,d1            ;comp_type
  678.     beq.b    .nocom4
  679.     move.l    (lbuffpt,pc),a0        ;inbuf
  680.     move.l    (buff1pt,pc),a1        ;outbuf
  681.     move    (a0)+,d2        ;initial value
  682.     move    d2,(a1)+
  683.     subq.l    #2,d0            ;inlen
  684.     bsr.w    decompress_4bit_delta
  685.     move.b    d0,(initial_value,a4)
  686. .nocom4
  687.  
  688. ;--------------------------------------
  689. ; prepare stereo
  690.     tst    (is_stereo,a4)
  691.     beq.w    .no_stereo
  692.  
  693.     lea    (smpfh2,pc),a0
  694.     move.l    (filenamept,pc),(mfh_filename,a0)
  695.     bsr.w    _XOpen            ;open file a second time
  696.     tst.l    d0
  697.     bne.w    handle_xopen_error
  698.  
  699.     move.l    #buffersize*2,d0
  700.     moveq    #2,d1            ;MEMF_CHIP
  701.     CALLEXEC AllocVec        ;alloc second chip buffer
  702.     move.l    d0,(buffspt,a4)
  703.     beq.w    memerr
  704.     move.l    d0,(buffs1pt,a4)
  705.     add.l    #buffersize,d0
  706.     move.l    d0,(buffs2pt,a4)
  707.  
  708.     lea    (smpfh2,pc),a0
  709.     move.l    (bodylen,pc),d2
  710.     lsr.l    #1,d2
  711.     add.l    (bodystart,pc),d2
  712.     move.l    d2,(stereostart,a4)
  713.     moveq    #OFFSET_CURRENT,d3
  714.     bsr.w    _XSeek            ;seek to half of BODY
  715.  
  716.     move.l    (buff1size,pc),(buffs1size,a4)
  717.     move.l    (buff2size,pc),(buffs2size,a4)
  718.     tst    (playmode,a4)
  719.     beq.b    .large
  720.     move.l    (buffs1pt,pc),(buffs2pt,a4)
  721. .large
  722.     move.l    (buffs1size,pc),d3
  723.     move.l    (buffs1pt,pc),d2
  724.     move    (compression,pc),d7
  725.     beq.b    .nocom1
  726.     lsr.l    #1,d3        ;half loading size
  727.     move.l    (lbuffpt,pc),d2
  728. .nocom1
  729.     lea    (smpfh2,pc),a0
  730.     bsr.w    _XRead
  731.     cmp.l    d0,d3
  732.     bne.w    readerr
  733.  
  734.     move    d7,d1            ;comp_type
  735.     beq.b    .nocom3
  736.     move.l    (lbuffpt,pc),a0        ;inbuf
  737.     move.l    (buffs1pt,pc),a1    ;outbuf
  738.     move    (a0)+,d2        ;initial value
  739.     move    d2,(a1)+
  740.     subq.l    #2,d0            ;inlen
  741.     bsr.w    decompress_4bit_delta
  742.     move.b    d0,(initial_value2,a4)
  743. .nocom3
  744. .no_stereo
  745.     
  746. ;--------------------------------------
  747. ; init progress indicator window
  748.     move.l    (noprogress,pc),d0
  749.     bne.w    noprogresswin
  750.     move.l    (filenamept,pc),d1
  751.     CALLDOS    FilePart
  752.     move.l    d0,(filepart,a4)
  753.     move.l    (pubscrnam,pc),d0
  754.     beq.b    .defps
  755.     move.l    d0,a0
  756.     CALLINT    LockPubScreen
  757.     move.l    d0,(pubscreen,a4)
  758.     bne.b    .psok
  759.     move.l    (output,pc),d1
  760.     lea    (pubscrtxt,pc),a0
  761.     move.l    a0,d2
  762.     lea    (pubscrnam,pc),a0
  763.     move.l    a0,d3
  764.     CALLDOS    VFPrintf
  765. .defps    sub.l    a0,a0
  766.     CALLINT    LockPubScreen        ;lock default public screen
  767.     move.l    d0,(pubscreen,a4)
  768.     beq.w    err_ende
  769. .psok    move.l    d0,a0
  770.     move.l    a0,(owt_pubscr+4,a4)
  771.  
  772.     move.l    (40,a0),a0    ;screen.sc_Font
  773.     moveq    #0,d1
  774.     move    (4,a0),d1    ;screen.sc_Font->ta_YSize
  775.     move.l    d1,(fontheight,a4)
  776.     lsl.l    #3,d1
  777.     move.l    d1,(owt_height+4,a4)    ;8*fontheight
  778.  
  779.     move.l    (pubscreen,pc),a1
  780.     add    #84,a1        ;screen.sc_RastPort
  781.     move.l    a1,d7
  782.     lea    (timetxt,pc),a0
  783.     moveq    #timetxtlen,d0
  784.     CALLGFX    TextLength        ;fit timetxt-width
  785.     move.l    d0,(timetxtwidth,a4)
  786.     add.l    d0,d0
  787.     cmp.l    (owt_width+4,pc),d0
  788.     bmi.b    .nw1
  789.     move.l    d0,(owt_width+4,a4)
  790. .nw1    move.l    (filepart,pc),a0
  791.     move.l    a0,a2
  792.     moveq    #-1,d0
  793. .count    addq.l    #1,d0
  794.     tst.b    (a2)+
  795.     bne.b    .count
  796.     move.l    d0,(filepartlen,a4)
  797.     move.l    d7,a1
  798.     CALL    TextLength        ;fit filename-width
  799.     move.l    d0,(filepartwidth,a4)
  800.     add.l    d0,d0
  801.     cmp.l    (owt_width+4,pc),d0
  802.     bmi.b    .nw2
  803.     move.l    d0,(owt_width+4,a4)
  804. .nw2
  805.     move.l    (pubscreen,pc),a0
  806.     move    (12,a0),d0    ;screen.sc_Width
  807.     sub    (owt_width+6,pc),d0
  808.     bmi.b    .nwc
  809.     lsr    #1,d0
  810.     move    d0,(owt_left+6,a4)
  811. .nwc    move    (14,a0),d0    ;screen.sc_Height
  812.     sub    (owt_height+6,pc),d0
  813.     bmi.b    .nhc
  814.     lsr    #1,d0
  815.     move    d0,(owt_top+6,a4)
  816. .nhc
  817.     sub.l    a0,a0
  818.     lea    (openwindow_tags,pc),a1
  819.     CALLINT    OpenWindowTagList
  820.     move.l    d0,(intuiwindow,a4)
  821.     beq.w    err_ende
  822.     move.l    d0,a5
  823.     CALLEXEC Disable
  824.     move.l    (86,a5),a5    ;window.wd_UserPort
  825.     move.b    #1,(14,a5)    ;window.wd_UserPort->mp_Flags=PA_SOFTINT
  826.     lea    (idcmp_softint,pc),a1
  827.     move.l    a1,(16,a5)    ;window.wd_UserPort->mp_SigTask/mp_SoftInt
  828.     CALL    Enable
  829.  
  830.     move.l    (intuiwindow,pc),a5
  831.     move.l    (50,a5),d7    ;window.wd_RPort !!!
  832.     move.l    d7,a1
  833.     moveq    #1,d0        ;JAM2
  834.     CALLGFX    SetDrMd
  835.     move.l    d7,a1
  836.     moveq    #0,d0
  837.     CALL    SetBPen
  838.     move.l    d7,a1
  839.     move.l    (pubscreen,pc),a0
  840.     move.l    (84+52,a0),a0    ;screen.RastPort.TextFont
  841.     CALL    SetFont
  842.  
  843.     move.l    d7,a1
  844.     moveq    #3,d0
  845.     CALL    SetAPen
  846.     move.l    d7,a1
  847.     moveq    #0,d0
  848.     moveq    #0,d1
  849.     moveq    #0,d2
  850.     move    (112,a5),d2    ;window.wd_GZZWidth
  851.     moveq    #0,d3
  852.     move    (114,a5),d3    ;window.wd_GZZHeight
  853.     CALL    RectFill
  854.  
  855.     moveq    #0,d0
  856.     move    (112,a5),d0    ;window.wd_GZZWidth
  857.     subq    #1,d0
  858.     move.l    d0,d2        ;!!!
  859.     move.l    d0,d1
  860.     divu    #25,d1
  861.     swap    d1
  862.     clr    d1
  863.     swap    d1
  864.     move.l    d1,(pbleft,a4)
  865.     sub.l    d1,d0
  866.     move.l    d0,(pbright,a4)
  867.     move.l    (fontheight,pc),d0
  868.     move.l    d0,d1
  869.     move.l    d0,d3
  870.     lsr.l    #1,d3        ;!!!
  871.     add.l    d1,d1
  872.     add.l    d3,d1
  873.     move.l    d1,(pbtop,a4)
  874.     add.l    d0,d1        ;!!!
  875.     move.l    d1,(pbbot,a4)
  876.     sub.l    (timetxtwidth,pc),d2    ;!!!
  877.     lsr.l    #1,d2
  878.     move.l    d2,(timetxtx,a4)
  879.     add.l    d0,d1            ;!!!
  880.     add.l    d3,d1
  881.     move.l    d1,(timetxty,a4)
  882.  
  883.     move.l    d7,a1
  884.     move.l    (pbleft,pc),d0
  885.     lsr.l    #1,d0
  886.     move.l    d0,a3
  887.     move.l    d0,(gadget_left,a4)
  888.     move.l    (fontheight,pc),d1
  889.     lsr.l    #1,d1
  890.     move.l    d1,d5
  891.     move.l    (pbright,pc),d2
  892.     add.l    d0,d2
  893.     move.l    d2,d4
  894.     move.l    d2,(gadget_right,a4)
  895.     move.l    (timetxty,pc),d3
  896.     add.l    d1,d3
  897.     move.l    d3,d6
  898.     CALL    EraseRect
  899.  
  900.     move.l    d7,a1
  901.     moveq    #2,d0
  902.     CALL    SetAPen
  903.     move.l    d7,a1
  904.     move.l    a3,d0
  905.     move.l    d6,d1
  906.     CALL    Move
  907.     move.l    d7,a1
  908.     move.l    a3,d0
  909.     move.l    d5,d1
  910.     CALL    Draw
  911.     move.l    d7,a1
  912.     move.l    d4,d0
  913.     move.l    d5,d1
  914.     CALL    Draw
  915.     move.l    d7,a1
  916.     moveq    #1,d0
  917.     CALL    SetAPen
  918.     move.l    d7,a1
  919.     move.l    d4,d0
  920.     move.l    d6,d1
  921.     CALL    Draw
  922.     move.l    d7,a1
  923.     move.l    a3,d0
  924.     move.l    d6,d1
  925.     CALL    Draw
  926.  
  927.     moveq    #0,d0
  928.     move    (112,a5),d0    ;window.wd_GZZWidth
  929.     sub.l    (filepartwidth,pc),d0
  930.     bge.b    .fpw
  931.     moveq    #0,d0
  932. .fpw    lsr.l    #1,d0        ;x
  933.     move.l    (fontheight,pc),d1
  934.     add.l    d1,d1        ;y
  935.     move.l    d7,a1
  936.     CALL    Move
  937.     move.l    d7,a1
  938.     move.l    (filepart,pc),a0
  939.     move.l    (filepartlen,pc),d0
  940.     CALL    Text
  941.  
  942.     move.l    (pbright,pc),d1
  943.     sub.l    (pbleft,pc),d1
  944.     subq.l    #2,d1
  945.     move.l    d1,(pbwidth,a4)
  946.     move.l    (bytestoplay,pc),d0
  947.     CALLUTIL UDivMod32
  948.     move.l    d0,(bytestoplay,a4)
  949.     moveq    #"0",d3
  950.     moveq    #0,d1
  951.     moveq    #1,d2
  952.     move    (minutes,pc),d0
  953. .min    subq    #1,d0
  954.     bmi.b    .mine
  955.     abcd    d2,d1
  956.     bra.b    .min
  957. .mine    move    d1,d0
  958.     lsr    #4,d0
  959.     add    d3,d0
  960.     move.b    d0,(timetxt_tm,a4)
  961.     and    #$f,d1
  962.     add    d3,d1
  963.     move.b    d1,(timetxt_tm+1,a4)
  964.     moveq    #0,d1
  965.     move    (seconds,pc),d0
  966. .sec    subq    #1,d0
  967.     bmi.b    .sece
  968.     abcd    d2,d1
  969.     bra.b    .sec
  970. .sece    move    d1,d0
  971.     lsr    #4,d0
  972.     add    d3,d0
  973.     move.b    d0,(timetxt_ts,a4)
  974.     and    #$f,d1
  975.     add    d3,d1
  976.     move.b    d1,(timetxt_ts+1,a4)
  977.  
  978.     move.l    d7,a1
  979.     move.l    (timetxtx,pc),d0
  980.     move.l    (timetxty,pc),d1
  981.     CALLGFX    Move
  982.     move.l    d7,a1
  983.     lea    (timetxt,pc),a0
  984.     moveq    #timetxtlen,d0
  985.     CALL    Text
  986.  
  987.     move.l    d7,a1
  988.     move.l    (pbleft,pc),d0
  989.     move.l    (pbbot,pc),d1
  990.     CALL    Move
  991.     move.l    d7,a1
  992.     move.l    (pbleft,pc),d0
  993.     move.l    (pbtop,pc),d1
  994.     CALL    Draw
  995.     move.l    d7,a1
  996.     move.l    (pbright,pc),d0
  997.     move.l    (pbtop,pc),d1
  998.     CALL    Draw
  999.     move.l    d7,a1
  1000.     moveq    #2,d0
  1001.     CALL    SetAPen
  1002.     move.l    d7,a1
  1003.     move.l    (pbright,pc),d0
  1004.     move.l    (pbbot,pc),d1
  1005.     CALL    Draw
  1006.     move.l    d7,a1
  1007.     move.l    (pbleft,pc),d0
  1008.     move.l    (pbbot,pc),d1
  1009.     CALL    Draw
  1010.  
  1011.  
  1012.  
  1013.     move.l    (pubscreen,pc),a0
  1014.     sub.l    a1,a1
  1015.     CALLGT    GetVisualInfoA
  1016.     move.l    d0,(visualinfo,a4)
  1017.     beq.w    err_ende
  1018.     lea    (g_glist,pc),a0
  1019.     CALL    CreateContext
  1020.     move.l    d0,(g_context,a4)
  1021.     beq.w    err_ende
  1022.  
  1023.     move.l    (pubscreen,pc),a0
  1024.     move.l    (40,a0),(ng_txtattr_,a4)    ;screen.sc_TextAttr
  1025.     move.l    (visualinfo,pc),(ng_visinfo_,a4)
  1026.  
  1027.     lea    (gtxt_filter,pc),a0
  1028.     move.l    a0,(ng_txt_,a4)
  1029.     moveq    #$10,d0            ;PLACETEXT_IN
  1030.     move.l    d0,(ng_flags_,a4)
  1031.     move    #FILTER_ID,(ng_gid_,a4)
  1032.     move    (gadget_left+2,pc),(ng_left_,a4)
  1033.  
  1034.     move.l    (intuiwindow,pc),a1
  1035.     move.l    (50,a1),a1        ;RastPort
  1036.     lea    (gtxt_filter,pc),a0
  1037.     moveq    #gtxt_filter_chars,d0
  1038.     CALLGFX    TextLength
  1039.     addq    #8,d0
  1040.     move    d0,(ng_width_,a4)
  1041.  
  1042.     move.l    (fontheight,pc),d0
  1043.     move.l    d0,d1
  1044.     addq    #4,d0
  1045.     move    d0,(ng_height_,a4)
  1046.     lsr.l    #1,d1
  1047.     add.l    d1,d0
  1048.     subq    #2,d0
  1049.     neg    d0
  1050.     move    d0,(ng_top_,a4)
  1051.     moveq    #1,d0            ;BUTTON_KIND
  1052.     move.l    (g_context,pc),a0    ;prev. gadget
  1053.     lea    (newgadget_,pc),a1
  1054.     lea    (newgadgettags,pc),a2
  1055.     CALLGT    CreateGadgetA
  1056.     move.l    d0,(g_filter,a4)
  1057.     beq.w    err_ende
  1058.     move.l    d0,a0
  1059.     or    #8,(12,a0)        ;GFLG_RELBOTTOM
  1060.     and    #~1,(14,a0)        ;not GACT_RELVERIFY
  1061.     or    #$102,(14,a0)        ;GACT_TOGGLESELECT + GACT_IMMEDIATE
  1062.     move.l    (filter,pc),d0
  1063.     beq.b    .nofilter
  1064.     or    #$80,(12,a0)        ;GFLG_SELECTED
  1065. .nofilter
  1066.  
  1067.     lea    (gtxt_repeat,pc),a0
  1068.     move.l    a0,(ng_txt_,a4)
  1069.     moveq    #$10,d0            ;PLACETEXT_IN
  1070.     move.l    d0,(ng_flags_,a4)
  1071.     move    #REPEAT_ID,(ng_gid_,a4)
  1072.  
  1073.     move.l    (intuiwindow,pc),a1
  1074.     move.l    (50,a1),a1        ;RastPort
  1075.     lea    (gtxt_repeat,pc),a0
  1076.     moveq    #gtxt_repeat_chars,d0
  1077.     CALLGFX    TextLength
  1078.     addq    #8,d0
  1079.     move    d0,(ng_width_,a4)
  1080.  
  1081.     move    (gadget_right+2,pc),d0
  1082.     addq    #1,d0
  1083.     sub    (ng_width_,pc),d0
  1084.     move    d0,(ng_left_,a4)
  1085.     moveq    #1,d0            ;BUTTON_KIND
  1086.     move.l    (g_filter,pc),a0    ;prev. gadget
  1087.     lea    (newgadget_,pc),a1
  1088.     lea    (newgadgettags,pc),a2
  1089.     CALLGT    CreateGadgetA
  1090.     move.l    d0,(g_repeat,a4)
  1091.     beq.w    err_ende
  1092.     move.l    d0,a0
  1093.     or    #8,(12,a0)        ;GLFG_RELBOTTOM
  1094.     and    #~1,(14,a0)        ;not GACT_RELVERIFY
  1095.     or    #$102,(14,a0)        ;GACT_TOGGLESELECT + GACT_IMMEDIATE
  1096.     move.l    (repeat,pc),d0
  1097.     beq.b    .norepeat
  1098.     or    #$80,(12,a0)        ;GFLG_SELECTED
  1099. .norepeat
  1100.  
  1101.     lea    (gtxt_info,pc),a0
  1102.     move.l    a0,(ng_txt_,a4)
  1103.     moveq    #$10,d0            ;PLACETEXT_IN
  1104.     move.l    d0,(ng_flags_,a4)
  1105.     move    #INFO_ID,(ng_gid_,a4)
  1106.  
  1107.     move.l    (intuiwindow,pc),a1
  1108.     move.l    (50,a1),a1        ;RastPort
  1109.     lea    (gtxt_info,pc),a0
  1110.     moveq    #gtxt_info_chars,d0
  1111.     CALLGFX    TextLength
  1112.     addq    #8,d0
  1113.     move    d0,(ng_width_,a4)
  1114.     move    (gadget_right+2,pc),d1
  1115.     move    (gadget_left+2,pc),d2
  1116.     sub    d2,d1
  1117.     lsr    #1,d1
  1118.     add    d2,d1
  1119.     lsr    #1,d0
  1120.     sub    d0,d1
  1121.     move    d1,(ng_left_,a4)
  1122.     moveq    #1,d0            ;BUTTON_KIND
  1123.     move.l    (g_repeat,pc),a0    ;prev. gadget
  1124.     lea    (newgadget_,pc),a1
  1125.     lea    (newgadgettags_e,pc),a2
  1126.     CALLGT    CreateGadgetA
  1127.     move.l    d0,(g_info,a4)
  1128.     beq.w    err_ende
  1129.     move.l    d0,a0
  1130.     or    #8,(12,a0)        ;GLFG_RELBOTTOM
  1131.  
  1132.     move.l    (intuiwindow,pc),a5
  1133.     move.l    a5,a0
  1134.     move.l    (g_glist,pc),a1
  1135.     moveq    #-1,d0
  1136.     moveq    #-1,d1
  1137.     sub.l    a2,a2
  1138.     CALLINT    AddGList
  1139.     move.l    a5,a1
  1140.     move.l    (g_glist,pc),a0
  1141.     sub.l    a2,a2
  1142.     CALL    RefreshGadgets
  1143.  
  1144. noprogresswin
  1145.  
  1146.  
  1147.  
  1148. ;--------------------------------------
  1149. ; setup timing
  1150.     moveq    #-1,d0
  1151.     CALLEXEC AllocSignal
  1152.     move.l    d0,(signal,a4)        ;own signal
  1153.     moveq    #-1,d1
  1154.     cmp.l    d0,d1
  1155.     beq.w    err_ende
  1156.     sub.l    a1,a1
  1157.     CALL    FindTask
  1158.     move.l    d0,(mytask,a4)        ;own task
  1159.     move.l    d0,a1
  1160.     moveq    #10,d0
  1161.     CALL    SetTaskPri
  1162.     move.l    d0,(oldpri,a4)
  1163.  
  1164.     lea    ($dff000),a5
  1165.     move    #$780,d0
  1166.     move    d0,(intena,a5)
  1167.     move    d0,(intreq,a5)        ;audio irqs off
  1168.     moveq    #7,d0        ;INTB_AUD0
  1169.     lea    (int_struct,pc),a1
  1170.     CALL    SetIntVector
  1171.     move.l    d0,(oldlevel4,a4)
  1172.     move    #$8080,d0
  1173.     move    d0,(intena,a5)
  1174.     move    d0,(intreq,a5)        ;audio irq 0 on
  1175.  
  1176. ;--------------------------------------
  1177. mainloop
  1178.     clr    (read_busy,a4)
  1179.     move.l    #$0000f000,d7    ;break signals
  1180.     move.l    (signal,pc),d1    ;signalnumber
  1181.     moveq    #1,d0
  1182.     lsl.l    d1,d0
  1183.     or.l    d7,d0        ;signalmask
  1184.     CALLEXEC Wait
  1185.     move.l    d0,d6
  1186.     and.l    d7,d0
  1187.     beq.b    .nobreak
  1188.  
  1189.     lea    (new_gadget_state,pc),a5
  1190.  
  1191.     rol    #4,d0        ;lsr #12
  1192.     moveq    #8,d1        ;CTRL-F
  1193.     and    d0,d1
  1194.     beq.b    .no_ctrlf
  1195.     st    (a5)
  1196.     lea    ($bfe001),a0
  1197.     lea    (filter,pc),a1
  1198.     tst.l    (a1)
  1199.     bne.b    .filter_is_on
  1200.     st    (a1)
  1201.     bclr    #1,(a0)        ;filter on
  1202.     bra.b    .no_ctrlf
  1203. .filter_is_on
  1204.     clr.l    (a1)
  1205.     bset    #1,(a0)        ;filter off
  1206. .no_ctrlf
  1207.     moveq    #4,d1        ;CTRL-E
  1208.     and    d0,d1
  1209.     beq.b    .no_ctrle
  1210.     st    (a5)
  1211.     clr.l    (repeat,a4)    ;repeat mode off
  1212. .no_ctrle
  1213.     moveq    #2,d1        ;CTRL-D
  1214.     and    d0,d1
  1215.     beq.b    .no_ctrld
  1216.     st    (a5)
  1217.     st    (repeat,a4)    ;repeat mode on
  1218. .no_ctrld
  1219.     moveq    #1,d1        ;CTRL-C
  1220.     and    d0,d1
  1221.     bne.w    ende
  1222.     not.l    d7
  1223.     and.l    d7,d6
  1224.     beq.b    mainloop    ;no other signal (for loading)
  1225. .nobreak
  1226.     tst    (playmode,a4)
  1227.     bne.b    mainloop    ;small sample
  1228.  
  1229.  
  1230.     moveq    #0,d7        ;!!!!
  1231.     st    (read_busy,a4)
  1232.  
  1233.     move.l    d7,-(a7)
  1234.     move.l    (intuiwindow,pc),d7    ;---progress indicator
  1235.     beq.w    .noprogress
  1236.  
  1237.     move.l    (do_info_req,pc),d0
  1238.     beq.b    .not_inforeq
  1239.     move.l    (info_req_window,pc),d0
  1240.     bne.b    .not_inforeq
  1241.     lea    (easystruct_,pc),a1
  1242.     lea    (info_req_gad,pc),a0
  1243.     move.l    a0,(16,a1)    ;gadgets text
  1244.     lea    (info_req_msg,pc),a0
  1245.     move.l    a0,(12,a1)    ;message text
  1246.     lea    (info_req_args,pc),a3
  1247.     move.l    a3,a2
  1248.     lea    (vstr+6,pc),a0
  1249.     move.l    a0,(a2)+
  1250.     move.l    (filenamept,pc),(a2)+
  1251.     move.l    (rate_play,pc),(a2)+
  1252.     move.l    (minutes,pc),(a2)+
  1253.     move    (millisec,pc),(a2)+
  1254.     move.l    (intuiwindow,pc),a0
  1255.     sub.l    a2,a2
  1256.     CALLINT    BuildEasyRequestArgs
  1257.     move.l    d0,(info_req_window,a4)
  1258.     bne.b    .not_inforeq
  1259.     clr.l    (do_info_req,a4)    ;if it didn't open
  1260. .not_inforeq
  1261.  
  1262.     move.l    (info_req_window,pc),d6
  1263.     beq.b    .not_inforeq_open
  1264.     move.l    d6,a0
  1265.     sub.l    a1,a1
  1266.     moveq    #0,d0
  1267.     CALLINT    SysReqHandler
  1268.     tst.l    d0
  1269.     bmi.b    .not_inforeq_open
  1270.     move.l    d6,a0
  1271.     CALL    FreeSysRequest
  1272.     clr.l    (info_req_window,a4)
  1273.     clr.l    (do_info_req,a4)
  1274. .not_inforeq_open
  1275.  
  1276.     move.l    d7,a0
  1277.     move.l    (124,a0),a5    ;window.wd_WLayer
  1278.     CALLGFX    AttemptLockLayerROM
  1279.     tst.l    d0
  1280.     beq.w    .noprogress
  1281.     lea    (new_gadget_state,pc),a0
  1282.     tst.l    (a0)
  1283.     beq.b    .notgad
  1284.     clr.l    (a0)
  1285.     move.l    (g_filter,pc),a0
  1286.     move    #$80,d1        ;GFLG_SELECTED
  1287.     move.l    (filter,pc),d0
  1288.     beq.b    .fg_off
  1289.     or    d1,(12,a0)
  1290.     bra.b    .fg_
  1291. .fg_off    not    d1
  1292.     and    d1,(12,a0)
  1293. .fg_    move.l    (g_repeat,pc),a0
  1294.     move    #$80,d1        ;GFLG_SELECTED
  1295.     move.l    (repeat,pc),d0
  1296.     beq.b    .rg_off
  1297.     or    d1,(12,a0)
  1298.     bra.b    .rg_
  1299. .rg_off    not    d1
  1300.     and    d1,(12,a0)
  1301. .rg_    move.l    d7,a1
  1302.     move.l    (g_glist,pc),a0
  1303.     sub.l    a2,a2
  1304.     CALLINT    RefreshGadgets
  1305. .notgad
  1306.     move.l    d7,a0
  1307.     move.l    (50,a0),a5    ;window.wd_RPort
  1308.     move.l    (playedbytes,pc),d0
  1309.     move.l    (bytestoplay,pc),d1
  1310.     CALLUTIL UDivMod32
  1311.     move.l    (pbwidth,pc),d1
  1312.     cmp.l    d0,d1
  1313.     bge.b    .prwok
  1314.     move.l    d1,d0
  1315. .prwok    move.l    d0,d7
  1316.     move.l    (pbcurrent,pc),d6
  1317.     move.l    d0,(pbcurrent,a4)
  1318.     move.l    (pbleft,pc),d0
  1319.     addq.l    #1,d0
  1320.     add.l    d0,d6
  1321.     add.l    d0,d7
  1322.     move.l    (gfxbase,pc),a6    ;!!!
  1323.     cmp.l    d6,d7        ;clear?
  1324.     bge.b    .prdraw
  1325.     moveq    #1,d6
  1326.     add.l    (pbleft,pc),d6
  1327.     move.l    a5,a1
  1328.     moveq    #0,d0
  1329.     CALL    SetAPen
  1330.     move.l    a5,a1
  1331.     move.l    (pbleft,pc),d0
  1332.     move.l    (pbtop,pc),d1
  1333.     move.l    (pbright,pc),d2
  1334.     move.l    (pbbot,pc),d3
  1335.     addq.l    #1,d0
  1336.     addq.l    #1,d1
  1337.     subq.l    #1,d2
  1338.     subq.l    #1,d3
  1339.     CALL    RectFill
  1340. .prdraw    move.l    a5,a1        ;draw
  1341.     moveq    #3,d0
  1342.     CALL    SetAPen
  1343.     move.l    d6,d0
  1344.     move.l    (pbtop,pc),d1
  1345.     addq.l    #1,d1
  1346.     move.l    d7,d2
  1347.     move.l    (pbbot,pc),d3
  1348.     subq.l    #1,d3
  1349.     CALL    RectFill
  1350.  
  1351. .prtime    move.l    (playedbytes,pc),d0
  1352.     move.l    (rate_play,pc),d1
  1353.     CALLUTIL UDivMod32
  1354.     divu    #60,d0
  1355.     move    d0,(timemin,a4)
  1356.     swap    d0
  1357.     move    d0,(timesec,a4)
  1358.     moveq    #"0",d7
  1359.     moveq    #0,d1
  1360.     moveq    #1,d2
  1361. .prsec    subq    #1,d0
  1362.     bmi.b    .prsece
  1363.     abcd    d2,d1
  1364.     bra.b    .prsec
  1365. .prsece    move    d1,d0
  1366.     lsr    #4,d0
  1367.     add    d7,d0
  1368.     move.b    d0,(timetxt_cs,a4)
  1369.     and    #$f,d1
  1370.     add    d7,d1
  1371.     move.b    d1,(timetxt_cs+1,a4)
  1372.     swap    d0
  1373.     moveq    #0,d1
  1374. .prmin    subq    #1,d0
  1375.     bmi.b    .prmine
  1376.     abcd    d2,d1
  1377.     bra.b    .prmin
  1378. .prmine    move    d1,d0
  1379.     lsr    #4,d0
  1380.     add    d7,d0
  1381.     move.b    d0,(timetxt_cm,a4)
  1382.     and    #$f,d1
  1383.     add    d7,d1
  1384.     move.b    d1,(timetxt_cm+1,a4)
  1385.  
  1386.     move.l    a5,a1
  1387.     moveq    #1,d0
  1388.     CALLGFX    SetAPen
  1389.     move.l    a5,a1
  1390.     move.l    (timetxtx,pc),d0
  1391.     move.l    (timetxty,pc),d1
  1392.     CALL    Move
  1393.     move.l    a5,a1
  1394.     lea    (timetxt,pc),a0
  1395.     moveq    #timetxtlen,d0
  1396.     CALL    Text
  1397.  
  1398.     move.l    (intuiwindow,pc),a0
  1399.     move.l    (124,a0),a5    ;window.wd_WLayer
  1400.     CALL    UnlockLayerROM
  1401. .noprogress
  1402.     move.l    (a7)+,d7
  1403.  
  1404.  
  1405.  
  1406.     move.l    (bodyend,pc),d0
  1407.     tst    (is_stereo,a4)
  1408.     beq.b    .noste1
  1409.     lsr.l    #1,d0
  1410. .noste1
  1411.     sub.l    (currpos,pc),d0
  1412.     bmi.w    readerr
  1413.     bgt.b    .noseek
  1414.  
  1415.     ;---seek to start
  1416.     lea    (oneshot_last,pc),a0
  1417.     st    (a0)
  1418.     tst.l    (repeat,a4)
  1419.     beq.w    mainloop
  1420.     clr    (a0)
  1421.  
  1422.     clr.l    (playedbytes,a4)
  1423.     clr    (timemin,a4)
  1424.     clr    (timesec,a4)
  1425.  
  1426.     lea    (smpfh1,pc),a0
  1427.     move.l    (bodystart,pc),d2
  1428.     move.l    d2,(currpos,a4)
  1429.     moveq    #OFFSET_BEGINNING,d3
  1430.     bsr.w    _XSeek            ;seek to start of BODY
  1431.     tst.l    d0
  1432.     bmi.w    readerr
  1433.  
  1434.     tst    (is_stereo,a4)
  1435.     beq.b    .nost
  1436.     lea    (smpfh2,pc),a0
  1437.     move.l    (stereostart,pc),d2
  1438.     moveq    #OFFSET_BEGINNING,d3
  1439.     bsr.w    _XSeek            ;seek to half of BODY
  1440.     tst.l    d0
  1441.     bmi.w    readerr
  1442. .nost    move.l    #buffersize,d0
  1443.     moveq    #1,d7        ;!!!!
  1444. .noseek
  1445.  
  1446.     ;---read and decompress
  1447.     move.l    #buffersize,d3
  1448.     move.l    (buff1pt,pc),d2
  1449.     tst    (compression,a4)
  1450.     beq.b    .nocom1
  1451.     lsr.l    #1,d3
  1452.     move.l    (lbuffpt,pc),d2
  1453. .nocom1
  1454.     cmp.l    d0,d3
  1455.     ble.b    .read
  1456.     move.l    d0,d3
  1457. .read    lea    (smpfh1,pc),a0
  1458.     bsr.w    _XRead
  1459.     cmp.l    d0,d3
  1460.     bne.w    readerr
  1461.     add.l    d0,(currpos,a4)
  1462.     move.l    d0,(buff1size,a4)
  1463.     move    (compression,pc),d1    ;comp_type
  1464.     beq.b    .check_stereo
  1465.     add.l    d0,(buff1size,a4)
  1466.     move.l    (lbuffpt,pc),a0        ;inbuf
  1467.     move.l    (buff1pt,pc),a1        ;outbuf
  1468.     move.b    (initial_value,pc),d2
  1469.     tst.l    d7        ;!!!!
  1470.     beq.b    .not_start
  1471.     move    (a0)+,d2        ;initial value
  1472.     move    d2,(a1)+
  1473.     subq.l    #2,d0            ;inlen
  1474. .not_start
  1475.     bsr.w    decompress_4bit_delta
  1476.     move.b    d0,(initial_value,a4)
  1477.  
  1478. .check_stereo
  1479.     tst    (is_stereo,a4)
  1480.     beq.w    mainloop
  1481.     lea    (smpfh2,pc),a0
  1482.     move.l    (buff1size,pc),d3    ;len from other side
  1483.     move.l    (buffs1pt,pc),d2
  1484.     tst    (compression,a4)
  1485.     beq.b    .nocom2
  1486.     lsr.l    #1,d3
  1487.     move.l    (lbuffpt,pc),d2
  1488. .nocom2    bsr.w    _XRead
  1489.     cmp.l    d0,d3
  1490.     bne.w    readerr
  1491.     move.l    d0,(buffs1size,a4)
  1492.     move    (compression,pc),d1    ;comp_type
  1493.     beq.w    mainloop
  1494.     add.l    d0,(buffs1size,a4)
  1495.     move.l    (lbuffpt,pc),a0        ;inbuf
  1496.     move.l    (buffs1pt,pc),a1    ;outbuf
  1497.     move.b    (initial_value2,pc),d2
  1498.     tst.l    d7        ;!!!!
  1499.     beq.b    .not_start2
  1500.     move    (a0)+,d2        ;initial value
  1501.     move    d2,(a1)+
  1502.     subq.l    #2,d0            ;inlen
  1503. .not_start2
  1504.     bsr.w    decompress_4bit_delta
  1505.     move.b    d0,(initial_value2,a4)
  1506.     bra.w    mainloop
  1507.  
  1508.  
  1509.  
  1510.  
  1511.  
  1512.  
  1513. ;--------------------------------------
  1514. ; some global routines
  1515.  
  1516.  
  1517. check_idcmp    ;(called from MsgPort-SoftInt)
  1518.     movem.l    d1-a6,-(a7)
  1519.     move.l    (intuiwindow,pc),a0
  1520.     move.l    (86,a0),a0    ;window.wd_UserPort
  1521.     CALLEXEC GetMsg
  1522.     tst.l    d0
  1523.     beq.w    .exit
  1524.     move.l    d0,a5
  1525.     move.l    (20,a5),d0    ;msg.Class
  1526.     move    #$200,d1
  1527.     and    d0,d1
  1528.     beq.b    .notclosegadget
  1529.     moveq    #1,d0
  1530.     ror    #4,d0            ;Ctrl-C
  1531.     move.l    (mytask,pc),a1
  1532.     CALL    Signal
  1533.     bra.b    .reply
  1534. .notclosegadget
  1535.     moveq    #$20,d1
  1536.     and    d0,d1
  1537.     beq.b    .notgadgetdown
  1538.     move.l    (28,a5),a0    ;msg.IAddress
  1539.     move    (38,a0),d0    ;gadget.GadgetID
  1540.     move    (12,a0),d1    ;gadget.Flags
  1541.     cmp    #FILTER_ID,d0
  1542.     bne.b    .notfiltergadget
  1543.     lea    (filter,pc),a1
  1544.     lea    ($bfe001),a2
  1545.     move    #$80,d0        ;GFLG_SELECTED
  1546.     and    d1,d0
  1547.     bne.b    .filtergadgetoff
  1548.     st    (a1)
  1549.     bclr    #1,(a2)        ;filter on
  1550.     bra.b    .reply
  1551. .filtergadgetoff
  1552.     clr.l    (a1)
  1553.     bset    #1,(a2)        ;filter off
  1554.     bra.b    .reply
  1555. .notfiltergadget
  1556.     cmp    #REPEAT_ID,d0
  1557.     bne.b    .notrepeatgadget
  1558.     lea    (repeat,pc),a1
  1559.     move    #$80,d0        ;GFLG_SELECTED
  1560.     and    d1,d0
  1561.     beq.b    .repeatgadgetoff
  1562.     clr.l    (a1)        ;repeat off
  1563.     bra.b    .reply
  1564. .repeatgadgetoff
  1565.     st    (a1)        ;repeat on
  1566.     bra.b    .reply
  1567. .notrepeatgadget
  1568. .notgadgetdown
  1569.     moveq    #$40,d1
  1570.     and    d0,d1
  1571.     beq.b    .notgadgetup
  1572.     move.l    (28,a5),a0    ;msg.IAddress
  1573.     move    (38,a0),d0    ;gadget.GadgetID
  1574.     cmp    #INFO_ID,d0
  1575.     bne.b    .notinfogadget
  1576.     lea    (do_info_req,pc),a0
  1577.     st    (a0)
  1578.     ;;bra.b    .reply
  1579. .notinfogadget
  1580. .notgadgetup
  1581. .reply    move.l    a5,a1
  1582.     CALL    ReplyMsg
  1583. .exit    movem.l    (a7)+,d1-a6
  1584.     moveq    #0,d0
  1585.     rts
  1586.  
  1587.  
  1588.  
  1589.  
  1590. mylevel4    ;-----------
  1591.     movem.l    d1-a6,-(a7)
  1592.     lea    ($dff000),a5
  1593.     lea    (first_,pc),a4
  1594.  
  1595.     lea    ($bfe001),a0
  1596.     tst.l    (filter,a4)
  1597.     beq.b    .filteroff
  1598.     bclr    #1,(a0)        ;filter on
  1599.     bra.b    .skipfilter
  1600. .filteroff
  1601.     bset    #1,(a0)        ;filter off
  1602. .skipfilter
  1603.     move    #$00ff,(adkcon,a5)
  1604.     move    (rate_amiga,pc),d0
  1605.     move    d0,(aud0per,a5)
  1606.     move    d0,(aud1per,a5)
  1607.     move    d0,(aud2per,a5)
  1608.     move    d0,(aud3per,a5)
  1609.  
  1610.     moveq    #64,d0
  1611.     tst    (read_busy,a4)
  1612.     beq.b    .volume
  1613.     moveq    #0,d0
  1614. .volume    move    d0,(aud0vol,a5)
  1615.     move    d0,(aud1vol,a5)
  1616.     move    d0,(aud2vol,a5)
  1617.     move    d0,(aud3vol,a5)
  1618.     tst    d0
  1619.     beq.w    .end
  1620.  
  1621.     move    #$000f,(dmacon,a5)    ;dma off
  1622.     move.l    (buff1pt,pc),d0
  1623.     move.l    d0,d1
  1624.     move.l    (buff1size,pc),d2
  1625.     move.l    d2,d3
  1626.     lsr.l    #1,d2
  1627.     tst    (is_stereo,a4)
  1628.     beq.b    .noster
  1629.     move.l    (buffs1pt,pc),d1
  1630.     move.l    (buffs1size,pc),d3
  1631. .noster    lsr.l    #1,d3
  1632.     move.l    d0,(aud0lch,a5)    
  1633.     move.l    d1,(aud1lch,a5)
  1634.     move.l    d1,(aud2lch,a5)
  1635.     move.l    d0,(aud3lch,a5)
  1636.     move    d2,(aud0len,a5)
  1637.     move    d3,(aud1len,a5)
  1638.     move    d3,(aud2len,a5)
  1639.     move    d2,(aud3len,a5)
  1640.  
  1641.     moveq    #8,d0
  1642.     bsr.b    .wait_hsync
  1643.     move    #$800f,(dmacon,a5)    ;dma on
  1644.     moveq    #8,d0
  1645.     bsr.b    .wait_hsync
  1646.  
  1647.     move.l    (buff2size,pc),d0
  1648.     add.l    d0,(playedbytes,a4)
  1649.  
  1650.     move.l    (buff1pt,pc),d0
  1651.     move.l    (buff2pt,pc),(buff1pt,a4)
  1652.     move.l    d0,(buff2pt,a4)
  1653.     move.l    (buff1size,pc),d0
  1654.     move.l    (buff2size,pc),(buff1size,a4)
  1655.     move.l    d0,(buff2size,a4)
  1656.  
  1657.     move.l    (buffs1pt,pc),d0
  1658.     move.l    (buffs2pt,pc),(buffs1pt,a4)
  1659.     move.l    d0,(buffs2pt,a4)
  1660.     move.l    (buffs1size,pc),d0
  1661.     move.l    (buffs2size,pc),(buffs1size,a4)
  1662.     move.l    d0,(buffs2size,a4)
  1663.  
  1664.     move.l    (repeat,pc),d7        ;loop
  1665.     tst    (playmode,a4)
  1666.     beq.b    .large
  1667.  
  1668.     tst    (firstirq,a4)
  1669.     bne.b    .notfirst
  1670.     st    (firstirq,a4)
  1671.     bra.b    .end
  1672.  
  1673. .wait_hsync    ;-----------------
  1674. ; d0=number_of_syncs   a5=$dff000
  1675. .outer    move.b    (6,a5),d1
  1676. .inner    cmp.b    (6,a5),d1
  1677.     beq.b    .inner
  1678.     subq    #1,d0
  1679.     bgt.b    .outer
  1680.     rts
  1681.  
  1682. .notfirst
  1683.     moveq    #1,d0
  1684.     ror    #4,d0
  1685.     tst.l    d7            ;loop?
  1686.     beq.b    .do_signal        ;no -> break
  1687.     bra.b    .end            ;yes -> no signal
  1688. .large
  1689.     move.l    (signal,pc),d1
  1690.     moveq    #1,d0
  1691.     lsl.l    d1,d0
  1692.     tst    (oneshot_last,a4)
  1693.     beq.b    .do_signal
  1694.     tst.l    d7
  1695.     bne.b    .do_signal
  1696.     moveq    #1,d0
  1697.     ror    #4,d0            ;break signals
  1698.  
  1699. .do_signal
  1700.     move.l    (mytask,pc),a1
  1701.     CALLEXEC Signal
  1702. .end
  1703.     move    #$780,(intreq,a5)
  1704.     movem.l    (a7)+,d1-a6
  1705.     moveq    #0,d0
  1706.     nop
  1707.     rts
  1708.  
  1709.  
  1710.  
  1711. ;***Decompress_4bit_Delta*******************************************
  1712. ; parameters:
  1713. ;  d0 - inlen (must be EVEN)
  1714. ;  d1 - comp_type (1 or 2)
  1715. ;  d2 - initial value
  1716. ;  a0 - inbuff
  1717. ;  a1 - outbuff
  1718. ; result:
  1719. ;  d0 - last value (initial value for next call)
  1720. decompress_4bit_delta
  1721.     movem.l    d1-a6,-(a7)
  1722.     lea    (fib_tab,pc),a2
  1723.     subq.b    #1,d1
  1724.     beq.b    .fib
  1725.     lea    (exp_tab,pc),a2
  1726. .fib    moveq    #0,d1
  1727.     moveq    #$0f,d5
  1728. .loop    move.b    (a0)+,d1
  1729.     move.l    d1,d3
  1730.     lsr    #4,d1
  1731.     add.b    (a2,d1.l),d2
  1732.     move.b    d2,d4
  1733.     lsl    #8,d4
  1734.     and    d5,d3
  1735.     add.b    (a2,d3.l),d2
  1736.     move.b    d2,d4
  1737.     swap    d4
  1738.     move.b    (a0)+,d1
  1739.     move.l    d1,d3
  1740.     lsr    #4,d1
  1741.     add.b    (a2,d1.l),d2
  1742.     move.b    d2,d4
  1743.     lsl    #8,d4
  1744.     and    d5,d3
  1745.     add.b    (a2,d3.l),d2
  1746.     move.b    d2,d4
  1747.     move.l    d4,(a1)+    ;LONG writes to the fucking slow ChipRAM
  1748.     subq.l    #2,d0        ;inlen is EVEN
  1749.     bgt.b    .loop
  1750.     move.l    d2,d0
  1751.     movem.l    (a7)+,d1-a6
  1752.     rts
  1753. fib_tab    dc.b    -34,-21,-13,-8,-5,-3,-2,-1,0,1,2,3,5,8,13,21
  1754. exp_tab    dc.b    -128,-64,-32,-16,-8,-4,-2,-1,0,1,2,4,8,16,32,64
  1755.  
  1756.  
  1757.  
  1758.  
  1759. ;***_XOpen**********************************************************
  1760. ; parameters:
  1761. ;  a0 - myFH (mfh_filename must have been initialized!)
  1762. ; result:
  1763. ;  d0 - 0=OK, other=ERROR
  1764. ; -DOSBase must be valid
  1765. ; -if file starts with "XPKF" and XPKBase=NULL
  1766. ;    -> result=-2 -> call _XOpen again when xpkmaster.library was opened
  1767. _xopen
  1768.     movem.l    d1-a6,-(a7)
  1769.     move.l    a0,a5
  1770.  
  1771.     moveq    #mfh_SIZEOF-5,d0    ;don't clear mfh_filename !!
  1772. .clrloo    clr.b    (a0)+
  1773.     dbf    d0,.clrloo
  1774.  
  1775.     move.l    (loadall,pc),d0
  1776.     beq.b    .notloadall
  1777.     move.l    (loadallvec,pc),a0
  1778.     cmp.l    #"XPKF",(a0)
  1779.     beq.b    .xla
  1780.     bra.w    .end_ok
  1781. .notloadall
  1782.  
  1783.     move.l    (mfh_filename,a5),d1
  1784.     move.l    #MODE_OLDFILE,d2
  1785.     CALLDOS    Open
  1786.     move.l    d0,(a5)
  1787.     bne.b    .open_ok
  1788.     moveq    #-1,d0            ;-1=DOS_OPEN_ERROR
  1789.     bra.w    .exit
  1790. .open_ok
  1791.     move.l    d0,d1
  1792.     lea    (.xpkf_test,pc),a0
  1793.     move.l    a0,d2
  1794.     moveq    #4,d3
  1795.     CALL    Read
  1796.  
  1797.     move.l    (.xpkf_test,pc),d0
  1798.     cmp.l    #"XPKF",d0
  1799.     beq.b    .is_xpk
  1800.     move.l    (a5),d1
  1801.     moveq    #0,d2
  1802.     moveq    #OFFSET_BEGINNING,d3
  1803.     CALL    Seek
  1804.     bra.b    .end_ok
  1805.  
  1806. .is_xpk
  1807.     move.l    (a5),d1
  1808.     CALL    Close
  1809.     clr.l    (a5)
  1810. .xla    move.l    (xpkbase,pc),d0
  1811.     bne.b    .xpklib_ok
  1812.     moveq    #-2,d0            ;-2=XPKMASTER_NOT_OPEN
  1813.     bra.b    .exit
  1814. .xpklib_ok
  1815.     move.l    d0,a6
  1816.     move.l    a5,a0
  1817.     lea    (xpkopentags,pc),a1
  1818.     tst.l    (loadall,a4)
  1819.     bne.b    .la
  1820.     move.l    (mfh_filename,a5),(4,a1)
  1821. .la    CALL    XpkOpen
  1822.     move.l    d0,(xpk_error,a4)
  1823.     beq.b    .xpkopen_ok
  1824.     moveq    #-3,d0            ;-3=XPK_ERROR
  1825.     bra.b    .exit
  1826. .xpkopen_ok
  1827.     st    (mfh_is_xpk,a5)
  1828.     move.l    (a5),a0
  1829.     move.l    (xf_NLen,a0),d0
  1830.     move.l    d0,(mfh_xbuffsize,a5)
  1831.     add.l    #XPK_MARGIN,d0
  1832.     moveq    #0,d1
  1833.     CALLEXEC AllocVec
  1834.     move.l    d0,(mfh_xbuff,a5)
  1835.     bne.b    .end_ok
  1836.     moveq    #-4,d0            ;-4=MEM_ERROR
  1837.     bra.b    .exit
  1838.  
  1839. .end_ok    moveq    #0,d0
  1840. .exit    movem.l    (a7)+,d1-a6
  1841.     rts
  1842.  
  1843. .xpkf_test    dc.l    0
  1844. xpkopentags    dc.l    XPK_InName,0    ;to be patched!
  1845.         dc.l    XPK_GetError,xpkerrormsg
  1846.         dc.l    XPK_ShortError,-1
  1847. xot_inlen    dc.l    0,0,0
  1848.  
  1849.  
  1850.  
  1851.  
  1852. ;***_XRead**********************************************************
  1853. ; parameters:
  1854. ;  a0 - myFH
  1855. ;  d2 - buffer
  1856. ;  d3 - len
  1857. ; result:
  1858. ;  d0 - bytes read (0=EOF, <0=ERROR)
  1859. _xread
  1860.     movem.l    d1-a6,-(a7)
  1861.     move.l    a0,a5        ;myFH
  1862.     tst    (mfh_is_xpk,a5)
  1863.     bne.b    .is_xpk
  1864.     move.l    (loadall,pc),d0
  1865.     beq.b    .nla
  1866.     move.l    (mfh_filepos,a5),a0
  1867.     add.l    (loadallvec,pc),a0
  1868.     move.l    d2,a1
  1869.     move.l    d3,d0
  1870.     add.l    d0,(mfh_filepos,a5)
  1871.     CALLEXEC CopyMem
  1872.     move.l    d3,d0
  1873.     bra.b    .exit
  1874. .nla    move.l    (a0),d1        ;mfh_fh
  1875.     CALLDOS    Read
  1876. .exit    movem.l    (a7)+,d1-a6
  1877.     rts
  1878. .is_xpk    move.l    d2,d6    ;buf
  1879.     move.l    d3,d7    ;len
  1880.     moveq    #0,d5    ;already read
  1881. .xloop    tst.l    d7
  1882.     bgt.b    .go_on
  1883. .eof    move.l    d5,d0
  1884.     add.l    d0,(mfh_filepos,a5)
  1885.     bra.b    .exit
  1886. .go_on    move.l    (mfh_buffcontent,a5),d0
  1887.     ble.b    .read
  1888.     sub.l    d0,d7
  1889.     bge.b    .copy
  1890.     add.l    d0,d7
  1891.     move.l    d7,d0
  1892.     moveq    #0,d7
  1893. .copy    move.l    (mfh_buffpos,a5),a0
  1894.     move.l    d6,a1
  1895.     add.l    d0,d5
  1896.     add.l    d0,(mfh_buffpos,a5)
  1897.     add.l    d0,d6
  1898.     sub.l    d0,(mfh_buffcontent,a5)
  1899.     CALLEXEC CopyMem
  1900.     bra.b    .xloop
  1901. .read    move.l    (a5),a0        ;mfh_fh
  1902.     move.l    (mfh_xbuff,a5),a1
  1903.     move.l    a1,(mfh_buffpos,a5)
  1904.     move.l    (mfh_xbuffsize,a5),d0
  1905.     CALLXPK    XpkRead
  1906.     move.l    d0,(mfh_buffcontent,a5)
  1907.     beq.b    .eof
  1908.     bgt.b    .xloop
  1909.     move.l    d0,(xpk_error,a4)
  1910.     bra.b    .exit
  1911.  
  1912.  
  1913. ;***_XSeek**********************************************************
  1914. ; parameters:
  1915. ;  a0 - myFH
  1916. ;  d2 - newpos (only positive numbers (forward seeking) supported)
  1917. ;  d3 - offset (only OFFSET_BEGINNING and OFFSET_CURRENT supported)
  1918. ; result:
  1919. ;  d0 - oldpos (<0=ERROR)
  1920. _xseek
  1921.     movem.l    d1-a6,-(a7)
  1922.     move.l    a0,a5            ;myFH
  1923.     tst    (mfh_is_xpk,a5)
  1924.     bne.b    .is_xpk
  1925.     move.l    (loadall,pc),d0
  1926.     beq.b    .nla
  1927.     move.l    (mfh_filepos,a5),d0    ;oldpos
  1928.     tst.l    d3
  1929.     beq.b    .offcur
  1930.     clr.l    (mfh_filepos,a5)
  1931. .offcur    add.l    d2,(mfh_filepos,a5)
  1932.     bra.b    .exit
  1933. .nla    move.l    (a5),d1
  1934.     CALLDOS    Seek
  1935. .exit    movem.l    (a7)+,d1-a6
  1936.     rts
  1937. .is_xpk    move.l    d2,d6            ;newpos
  1938.     move.l    (mfh_filepos,a5),d7    ;oldpos
  1939.     tst.l    d3            ;offset
  1940.     beq.b    .seek_loop        ;OFFSET_CURRENT
  1941.  
  1942.     move.l    (a5),a0
  1943.     CALLXPK    XpkClose
  1944.     clr.l    (a5)
  1945.     clr.l    (mfh_filepos,a5)
  1946.     clr.l    (mfh_buffcontent,a5)
  1947.     move.l    a5,a0
  1948.     lea    (xpkopentags,pc),a1
  1949.     tst.l    (loadall,a4)
  1950.     bne.b    .la
  1951.     move.l    (mfh_filename,a5),(4,a1)
  1952. .la    CALL    XpkOpen            ;"seek" to beginning
  1953.     move.l    d0,(xpk_error,a4)
  1954.     beq.b    .seek_loop
  1955.     moveq    #-1,d0            ;ERROR
  1956.     bra.b    .exit
  1957. .seek_loop
  1958.     tst.l    d6            ;newpos
  1959.     bgt.b    .do_seek
  1960.     move.l    d7,d0            ;return old position
  1961.     bra.b    .exit
  1962. .do_seek
  1963.     move.l    (mfh_buffcontent,a5),d0
  1964.     ble.b    .read
  1965.     cmp.l    d6,d0
  1966.     bmi.b    .not_enough
  1967.     sub.l    d6,(mfh_buffcontent,a5)
  1968.     add.l    d6,(mfh_buffpos,a5)
  1969.     add.l    d6,(mfh_filepos,a5)
  1970.     moveq    #0,d6
  1971.     bra.b    .seek_loop
  1972. .not_enough
  1973.     sub.l    d0,d6
  1974.     add.l    d0,(mfh_filepos,a5)
  1975. .read
  1976.     move.l    (a5),a0
  1977.     move.l    (mfh_xbuff,a5),a1
  1978.     move.l    a1,(mfh_buffpos,a5)
  1979.     move.l    (mfh_xbuffsize,a5),d0
  1980.     CALLXPK    XpkRead
  1981.     move.l    d0,(mfh_buffcontent,a5)
  1982.     beq.b    .eof
  1983.     bgt.b    .seek_loop
  1984.     move.l    d0,(xpk_error,a4)
  1985.     bra.w    .exit
  1986. .eof    moveq    #-1,d0            ;ERROR (EOF)
  1987.     bra.w    .exit
  1988.  
  1989.  
  1990.  
  1991. ;***_XClose*********************************************************
  1992. ; parameters:
  1993. ;  a0 - myFH (should be safe to call several times unlike DOS/Close()!!)
  1994. _xclose
  1995.     movem.l    d1-a6,-(a7)
  1996.     move.l    a0,a5
  1997.  
  1998.     move.l    (a5),d1
  1999.     beq.b    .no_fh
  2000.     clr.l    (a5)
  2001.     tst    (mfh_is_xpk,a5)
  2002.     bne.b    .is_xpk
  2003.     CALLDOS    Close
  2004.     bra.b    .no_fh
  2005. .is_xpk    move.l    (xpkbase,pc),d0
  2006.     beq.b    .no_fh
  2007.     move.l    d0,a6
  2008.     move.l    d1,a0
  2009.     CALL    XpkClose
  2010. .no_fh
  2011.     lea    (mfh_xbuff,a5),a0
  2012.     move.l    (a0),d0
  2013.     beq.b    .no_xbuff
  2014.     clr.l    (a0)
  2015.     move.l    d0,a1
  2016.     CALLEXEC FreeVec
  2017. .no_xbuff
  2018.     movem.l    (a7)+,d1-a6
  2019.     rts
  2020.  
  2021.  
  2022.  
  2023.  
  2024. ;--------------------------------------
  2025. ; exit
  2026. ende
  2027.     tst    (audioopen,a4)
  2028.     beq.b    .noaudio
  2029.     lea    ($dff000),a5
  2030.     move    #$780,d0
  2031.     move    d0,(intena,a5)
  2032.     moveq    #0,d0
  2033.     move    d0,(aud0vol,a5)
  2034.     move    d0,(aud1vol,a5)
  2035.     move    d0,(aud2vol,a5)
  2036.     move    d0,(aud3vol,a5)
  2037.     move    #$000f,(dmacon,a5)
  2038.     move.l    (4.w),a6
  2039.     move.l    (oldlevel4,pc),d0
  2040.     beq.b    .noint
  2041.     moveq    #7,d0        ;INTB_AUD0
  2042.     move.l    (oldlevel4,pc),a1
  2043.     CALL    SetIntVector
  2044. .noint    move.l    (ioreq,pc),a1
  2045.     CALL    CloseDevice
  2046. .noaudio
  2047.     move.l    (mytask,pc),d0
  2048.     beq.b    .nopri
  2049.     move.l    d0,a1
  2050.     move.l    (oldpri,pc),d0
  2051.     CALLEXEC SetTaskPri
  2052. .nopri
  2053.     move.l    (ioreq,pc),d0
  2054.     beq.b    .noioreq
  2055.     move.l    d0,a0
  2056.     CALLEXEC DeleteIORequest
  2057. .noioreq
  2058.     move.l    (msgport,pc),d0
  2059.     beq.b    .nomsgport
  2060.     move.l    d0,a0
  2061.     CALLEXEC DeleteMsgPort
  2062. .nomsgport
  2063.  
  2064.     move.l    (signal,pc),d0
  2065.     moveq    #-1,d1
  2066.     cmp.l    d0,d1
  2067.     beq.b    .nosignal
  2068.     CALLEXEC FreeSignal
  2069. .nosignal
  2070.     move.l    (rdargs,pc),d1
  2071.     beq.b    .noargs
  2072.     CALLDOS    FreeArgs
  2073. .noargs
  2074.  
  2075.     lea    (smpfh1,pc),a0
  2076.     bsr.w    _XClose
  2077.     lea    (smpfh2,pc),a0
  2078.     bsr.w    _XClose
  2079.  
  2080.     move.l    (info_req_window,pc),d0
  2081.     beq.b    .noreqwindow
  2082.     move.l    d0,a0
  2083.     CALLINT    FreeSysRequest
  2084. .noreqwindow
  2085.     move.l    (g_glist,pc),d7
  2086.     beq.b    .nogadgets
  2087.     move.l    (intuiwindow,pc),a0
  2088.     move.l    d7,a1
  2089.     moveq    #-1,d0
  2090.     CALLINT    RemoveGList
  2091.     move.l    d7,a0
  2092.     CALLGT    FreeGadgets
  2093. .nogadgets
  2094.     move.l    (visualinfo,pc),d0
  2095.     beq.b    .novisinfo
  2096.     move.l    d0,a0
  2097.     CALLGT    FreeVisualInfo
  2098. .novisinfo
  2099.     move.l    (gadtoolsbase,pc),d0
  2100.     beq.b    .nogtlib
  2101.     move.l    d0,a1
  2102.     CALLEXEC CloseLibrary
  2103. .nogtlib
  2104.     move.l    (xpkbase,pc),d0
  2105.     beq.b    .noxpklib
  2106.     move.l    d0,a1
  2107.     CALLEXEC CloseLibrary
  2108. .noxpklib
  2109.     move.l    (utilitybase,pc),d0
  2110.     beq.b    .noutillib
  2111.     move.l    d0,a1
  2112.     CALLEXEC CloseLibrary
  2113. .noutillib
  2114.     move.l    (iconbase,pc),d0
  2115.     beq.b    .noiconlib
  2116.     move.l    d0,a1
  2117.     CALLEXEC CloseLibrary
  2118. .noiconlib
  2119.     move.l    (buffspt,pc),d0
  2120.     beq.b    .nostereobuff
  2121.     move.l    d0,a1
  2122.     CALLEXEC FreeVec
  2123. .nostereobuff
  2124.     move.l    (loadallvec,pc),d0
  2125.     beq.b    .notloadall
  2126.     move.l    d0,a1
  2127.     CALLEXEC FreeVec
  2128. .notloadall
  2129.     move.l    (oldcurrdir,pc),d1
  2130.     beq.b    .nocurrdir
  2131.     CALLDOS    CurrentDir
  2132. .nocurrdir
  2133.     move.l    (intuiwindow,pc),d0
  2134.     beq.b    .nowin
  2135.     move.l    d0,a0
  2136.     CALLINT    CloseWindow
  2137. .nowin
  2138.     move.l    (pubscreen,pc),d0
  2139.     beq.b    .nopubscr
  2140.     sub.l    a0,a0
  2141.     move.l    d0,a1
  2142.     CALLINT    UnlockPubScreen
  2143. .nopubscr
  2144.     move.l    (conwindow,pc),d7
  2145.     beq.b    .nocon
  2146.     move.l    d7,d1
  2147.     lea    (anykeytxt,pc),a0
  2148.     move.l    a0,d2
  2149.     CALLDOS    FPutS
  2150.     move.l    d7,d1
  2151.     CALL    FGetC
  2152.     move.l    d7,d1
  2153.     CALL    Close
  2154. .nocon
  2155.     move.l    (wbmsg,pc),d0
  2156.     beq.b    .nowbmsg
  2157.     move.l    d0,a1
  2158.     CALLEXEC ReplyMsg
  2159. .nowbmsg
  2160.     move.l    (error,pc),d0
  2161.     rts
  2162. err_ende
  2163.     lea    (error+2,pc),a0
  2164.     move    #10,(a0)
  2165.     bra.w    ende
  2166.  
  2167.  
  2168.  
  2169. ;--------------------------------------
  2170. ; data area
  2171.  
  2172. dosnam        dc.b    "dos.library",0
  2173. gfxnam        dc.b    "graphics.library",0
  2174. utilnam        dc.b    "utility.library",0
  2175. iconnam        dc.b    "icon.library",0
  2176. xpknam        dc.b    "xpkmaster.library",0
  2177. rtnam        dc.b    "reqtools.library",0
  2178. intuinam    dc.b    "intuition.library",0
  2179. gtnam        dc.b    "gadtools.library",0
  2180. audionam    dc.b    "audio.device",0
  2181. connam        dc.b    "CON://// PSMP output",0
  2182. filereqtitle    dc.b    "PSMP: select IFF-8SVX file",0,0
  2183. filereqtags    dc.l    0
  2184. gadtoolsbase    dc.l    0
  2185. dosbase        dc.l    0
  2186. gfxbase        dc.l    0
  2187. utilitybase    dc.l    0
  2188. iconbase    dc.l    0
  2189. xpkbase        dc.l    0
  2190. intuitionbase    dc.l    0
  2191. read_busy    dc    0
  2192. is_stereo    dc    0
  2193. smpfh1        blk.b    mfh_SIZEOF,0
  2194. smpfh2        blk.b    mfh_SIZEOF,0
  2195. oldlevel4    dc.l    0
  2196. wbmsg        dc.l    0
  2197. output        dc.l    0
  2198. conwindow    dc.l    0
  2199. oldcurrdir    dc.l    0
  2200. pubscreen    dc.l    0
  2201. intuiwindow    dc.l    0
  2202. loadallvec    dc.l    0
  2203.  
  2204. tt_rate        dc.b    "PLAYBACKRATE",0
  2205. tt_filter    dc.b    "FILTER",0
  2206. tt_repeat    dc.b    "REPEAT",0
  2207. tt_info        dc.b    "INFO",0
  2208. tt_loadall    dc.b    "LOADALL",0
  2209. tt_noprogress    dc.b    "NOPROGRESS",0
  2210. tt_noinfo    dc.b    "NOINFO",0
  2211. tt_pubscreen    dc.b    "PUBSCREEN",0
  2212. rdargs        dc.l    0
  2213. template    dc.b    "FILE,P=PLAYBACKRATE/K/N,F=FILTER/S,R=REPEAT/S,I=INFO/S,L=LOADALL/S,NP=NOPROGRESS/S,NI=NOINFO/S,PS=PUBSCREEN/K",0
  2214. args_start
  2215. filenamept    dc.l    0
  2216. playbackrate    dc.l    0
  2217. filter        dc.l    0
  2218. repeat        dc.l    0
  2219. info        dc.l    0
  2220. loadall        dc.l    0
  2221. noprogress    dc.l    0
  2222. noinfo        dc.l    0
  2223. pubscrnam    dc.l    0
  2224. args_end
  2225.  
  2226. FILTER_ID="FI"
  2227. REPEAT_ID="RE"
  2228. INFO_ID="IN"
  2229.  
  2230. easystruct_    dc.l    20    ;len
  2231.         dc.l    0    ;flags
  2232.         dc.l    0    ;title
  2233.         dc.l    0    ;message
  2234.         dc.l    0    ;gadgets
  2235. info_req_gad    dc.b    "Infect rulez!",0
  2236. info_req_msg    dc.b    "%s",10        ;version string
  2237.         dc.b    "by Smack/Infect",10,10
  2238.         dc.b    "file:  '%s'",10
  2239.         dc.b    "rate:  %ld Hz",10
  2240.         dc.b    "duration:  %d min %02d.%03d sec",0
  2241. info_req_args    dc.l    0    ;version
  2242.         dc.l    0    ;filename
  2243.         dc.l    0    ;sampling rate
  2244.         dc    0,0,0    ;min,sec,milli
  2245. info_req_window    dc.l    0
  2246.  
  2247. newgadgettags    dc.l    1<<31+$80000+15,-1    ;GA_Immediate = TRUE
  2248. newgadgettags_e    dc.l    TAG_DONE
  2249. gadget_left    dc.l    0
  2250. gadget_right    dc.l    0
  2251. newgadget_
  2252. ng_left_    dc    0
  2253. ng_top_        dc    0
  2254. ng_width_    dc    0
  2255. ng_height_    dc    0
  2256. ng_txt_        dc.l    0    ;gadgettext
  2257. ng_txtattr_    dc.l    0    ;textattr
  2258. ng_gid_        dc    0    ;gadgetID
  2259. ng_flags_    dc.l    0    ;flags
  2260. ng_visinfo_    dc.l    0    ;visualinfo
  2261.         dc.l    0    ;userdata
  2262.  
  2263. gtxt_filter    dc.b    "Filter",0
  2264. gtxt_filter_chars=*-gtxt_filter-1
  2265. gtxt_repeat    dc.b    "Repeat",0
  2266. gtxt_repeat_chars=*-gtxt_repeat-1
  2267. gtxt_info    dc.b    "Info",0
  2268. gtxt_info_chars=*-gtxt_info-1
  2269.         even
  2270. g_glist        dc.l    0
  2271. g_context    dc.l    0
  2272. g_filter    dc.l    0
  2273. g_repeat    dc.l    0
  2274. g_info        dc.l    0
  2275. new_gadget_state    dc.l    0
  2276. do_info_req        dc.l    0
  2277. idcmp_softint    dc.l    0,0        ;is_Node ln_Succ, ln_Pred
  2278.         dc.b    2,0        ;is_Node ln_Type, ln_Pri
  2279.         dc.l    0        ;is_Node ln_Name
  2280.         dc.l    0,check_idcmp    ;is_Data, is_Code
  2281.  
  2282. window_title
  2283. int_name    dc.b    "PSMP",0,0
  2284. int_struct    dc.l    0,0        ;is_Node ln_Succ, ln_Pred
  2285.         dc.b    2,0        ;is_Node ln_Type, ln_Pri
  2286.         dc.l    int_name    ;is_Node ln_Name
  2287.         dc.l    0,mylevel4    ;is_Data, is_Code
  2288.  
  2289. openwindow_tags
  2290. owt_left    dc.l    $80000064,0    ;WA_Left
  2291. owt_top        dc.l    $80000065,0    ;WA_Top
  2292. owt_width    dc.l    $80000076,300    ;WA_InnerWidth
  2293. owt_height    dc.l    $80000077,0    ;WA_InnerHeight
  2294.         dc.l    $8000006a    ;WA_IDCMP:
  2295.             ;IDCMP_CloseWindow + IDCMP_GadgetDown + IDCMP_GadgetUp
  2296.         dc.l    $200+$20+$40
  2297.         dc.l    $8000006b    ;WA_Flags:
  2298.             ;ACTIVATE+CLOSEGADGET+DRAGBAR+DEPTHGADET+NOCAREREFRESH+RMBTRAP+SMARTREFRESH+GIMMEZEROZERO
  2299.         dc.l    $1000+8+2+4+$20000+$10000+0+$400
  2300.         dc.l    $8000006e,window_title;WA_Title
  2301. owt_pubscr    dc.l    $80000079,0    ;WA_PubScreen
  2302.         dc.l    TAG_DONE
  2303.  
  2304. packername    dc.b    0,0,0,0,0
  2305. xpkerrormsg    ds.b    XPKERRMSGSIZE+1
  2306.  
  2307. xpkerrtxtargs
  2308. xpk_error    dc.l    0
  2309.         dc.l    xpkerrormsg
  2310.  
  2311. xpktxt_args
  2312. packernamept    dc.l    packername
  2313. packerratio    dc.l    0
  2314. packerchszKB    dc.l    0
  2315.  
  2316. infotxt_args
  2317. bodylenKB    dc.l    0
  2318. rate        dc.l    0
  2319. stereostr    dc.l    0
  2320. compression    dc    0
  2321. compstr        dc.l    0
  2322. rate_arg    dc.l    0
  2323. rate_amiga    dc    0
  2324. rate_play    dc.l    0
  2325. minutes        dc    0
  2326. seconds        dc    0
  2327. millisec    dc    0
  2328.  
  2329. stereostart    dc.l    0
  2330. bodystart    dc.l    0
  2331. currpos        dc.l    0
  2332. bodylen        dc.l    0
  2333. bodyend        dc.l    0
  2334.  
  2335. error        dc.l    0
  2336. buff1pt        dc.l    buff1
  2337. buff2pt        dc.l    buff2
  2338. buff1size    dc.l    buffersize
  2339. buff2size    dc.l    buffersize
  2340. buffspt        dc.l    0
  2341. buffs1pt    dc.l    0
  2342. buffs2pt    dc.l    0
  2343. buffs1size    dc.l    buffersize
  2344. buffs2size    dc.l    buffersize
  2345. lbuffpt        dc.l    lbuff
  2346. filenamebuffpt    dc.l    filenam
  2347. filepart    dc.l    0
  2348. filepartlen    dc.l    0
  2349. filepartwidth    dc.l    0
  2350. fontheight    dc.l    0
  2351. timetxtwidth    dc.l    0
  2352. timetxtx    dc.l    0
  2353. timetxty    dc.l    0
  2354. timemin        dc.l    0
  2355. timesec        dc.l    0
  2356. pbleft        dc.l    0
  2357. pbright        dc.l    0
  2358. pbtop        dc.l    0
  2359. pbbot        dc.l    0
  2360. pbwidth        dc.l    0
  2361. pbcurrent    dc.l    0
  2362. playedbytes    dc.l    0
  2363. bytestoplay    dc.l    0
  2364.  
  2365. visualinfo    dc.l    0
  2366. oldpri        dc.l    0
  2367. mytask        dc.l    0
  2368. signal        dc.l    -1
  2369. msgport        dc.l    0
  2370. ioreq        dc.l    0
  2371. channelmap    dc    $0f0f
  2372. audioopen    dc    0
  2373. oneshot_last    dc    0
  2374. firstirq    dc    0
  2375. playmode    dc    0    ;0=large ( > buffersize*2 )
  2376.                 ;else small ( < buffersize*2 )
  2377. initial_value    dc.b    0
  2378. initial_value2    dc.b    0
  2379.  
  2380.  
  2381. vstr        dc.b    "$VER: PSMP 1.00 (Tue 21-Jan-97)",0
  2382. maintxt        dc.b    27,"[1mPSMP 1.00 (Tue 21-Jan-97) by Smack/Infect",27,"[0m",10,0
  2383. filetxt        dc.b    " file......%s",10,0
  2384. xpktxt        dc.b    " XPK.......%s, %ld%% gain, chunksize %ld KB",10,0
  2385. infotxt        dc.b    " features..%ld KB, %ld Hz, %s, compression %d (%s)",10
  2386.         dc.b    " rate......%ld Hz -> period %d -> %ld Hz",10
  2387.         dc.b    " duration..%d min %02d.%03d sec",10,0
  2388. comp0txt    dc.b    "none",0
  2389. comp1txt    dc.b    "Fibonacci Delta",0
  2390. comp2txt    dc.b    "Exponential Delta",0
  2391. monotxt        dc.b    "mono",0
  2392. stereotxt    dc.b    "stereo",0
  2393. argwarntxt    dc.b    "** wrong arguments, using default.",10,0
  2394. audioerrtxt    dc.b    "** can't allocate audio channels.",10,0
  2395. readerrtxt    dc.b    "** read error.",10,0
  2396. comperrtxt    dc.b    "** unknown compression.",10,0
  2397. xpkerrtxt    dc.b    "** XPK error %ld: %s",10,0
  2398. xpkliberrtxt    dc.b    "** can't open xpkmaster.library.",10,0
  2399. memerrtxt    dc.b    "** not enough memory.",10,0
  2400. pubscrtxt    dc.b    "** can't lock public screen '%s'",10,0
  2401. anykeytxt    dc.b    10,"press return to continue.",0
  2402. timetxt        dc.b    " 00:00 / 00:00 "
  2403. timetxtlen=*-timetxt
  2404. timetxt_cm=timetxt+1
  2405. timetxt_cs=timetxt+1+3
  2406. timetxt_tm=timetxt+1+8
  2407. timetxt_ts=timetxt+1+11
  2408.  
  2409.     section    bbbb,bss_c
  2410. buff1    ds.b    buffersize
  2411. buff2    ds.b    buffersize
  2412.  
  2413.  
  2414.     section    cccc,bss
  2415. filenam    ds.b    1024
  2416. psnam    ds.b    256
  2417. lbuff    ds.b    buffersize
  2418.